快速排序源代码
#include
#include
using namespace std;
const int N = 100000;
int a[N];
void quick_sort(int a[], int l, int r)
{
if(l >= r)
return;
int x = a[ l + r >> 1];
int i = l - 1, j = r + 1;
while(i < j)
{
do i++;
while(a[i] < x );
do j--;
while(a[j] > x);
if(i < j)
swap(a[i], a[j]);
}
quick_sort(a, l, j);
quick_sort(a, j+1, r);
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
quick_sort(a, 0, n - 1);
for(int i = 0; i < n; i++) printf("%d ", a[i]);
return 0;
}
区间问题?
quick_sort(a, l, j);
quick_sort(a, j+1, r);//这个可以AC
两个的区别是啥呢?
quick_sort(a, l, i-1);
quick_sort(a, i, r);//这个不能AC
这个区间问题和mid的取值是相互对应的,如果mid = a[l + r >> 1],此时取值在左边,如果排序符合从小到大的顺序,则最终扫描完一遍之后,指针指向mid的位置,两个数的话,就会在最左边,所以使用 i- 1会越界,应该采用j和j + 1。
如果mid = a[l + r + 1 >> 1],此时对满足条件的序列指针会指向右侧,指向右侧就采用i - 1和i。
解答:
#include
#include
using namespace std;
const int N = 100000;
void quick_sort(int a[], int i, int j)
{
if(i >= j) return;
int x = a[i + j + 1 >> 1];
int l = i - 1, r = j + 1;
while(l < r)
{
do l++;
while(a[l] < x);
do r--;
while(a[r] > x);
if(l < r) swap(a[l], a[r]);
}
quick_sort(a, i, l-1);
quick_sort(a, l, j);
}
int da[N];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++) scanf("%d", &da[i]);
quick_sort(da, 0, n - 1);
for(int i = 0; i < n; i++) printf("%d ", da[i]);
return 0;
}