我在实现二分法快速排序的时候,最初的程序是这样的。
#include<iostream>
using namespace std;
void qsort(int arr[],int left,int right)
{
int l = left;int r = right;
int value = arr[l];
do
{
while(l < r && arr[r] >= value)r--;
if(arr[r] < value){arr[l] = arr[r];l++;}
while(l < r && arr[l] <= value)l++;
if(arr[l] > value){arr[r] = arr[l];r--;}
} while (l != r);
arr[l] = value;
qsort(arr,left,r--);
qsort(arr,l++,right);
}
int a[100];
int main()
{
freopen("1.txt", "r", stdin);
freopen("2.txt", "w", stdout);
int n;cin >> n;
for(int i = 0;i < n ;i++)
cin >> a[i];
qsort(a,0,n-1);
for(int i = 0;i < n;i++)
cout << a[i];
}
这时的报错有/bin/sh: line 1: 12518 Segmentation fault: 11
据说是因为内存越界?
检查发现,我把边界点写错了qsort(arr,left,r--); qsort(arr,l++,right);
大错特错,还忘了写递归边界
修改后
#include<iostream>
using namespace std;
void qsort(int arr[],int left,int right)
{
if(left > right)return;
int l = left;int r = right;
int value = arr[l];
do
{
while(l < r && arr[r] >= value)r--;
if(arr[r] < value){arr[l] = arr[r];l++;}
while(l < r && arr[l] <= value)l++;
if(arr[l] > value){arr[r] = arr[l];r--;}
} while (l != r);
arr[l] = value;
qsort(arr,left,l-1);
qsort(arr,r+1,right);
}
int a[100];
int main()
{
freopen("1.txt", "r", stdin);
freopen("2.txt", "w", stdout);
int n;cin >> n;
for(int i = 0;i < n ;i++)
cin >> a[i];
qsort(a,0,n-1);
for(int i = 0;i < n;i++)
cout << a[i];
}
就ac了
好喜欢这一句话
来源:CSDN
作者:戎码关山
链接:https://blog.csdn.net/dghcs18/article/details/103909874