1.使用scanf函数提高运行效率
2.使用双指针双向读入,运行效率更高
3.定义一个量x,使得数组左右两边分别小于等于和大于等于x,进行快速排序;
4.用do,while循环最后一轮是已经不满足循环条件,此时a[i] >= x, a[j] <= x,
所以循环停止,此时只能使得中间的数 a[i] = a[j] = x, 注意在取x的时候,取了l,
后面快排时不能用 i 作区间,因为此时会形成死循环,其他同理,所以此时最好
选择定义中间量x来避免,且定义 i,j 指针时 要在区间的前后位置,因为指针
这里移动是先往后移动一格再按条件交换,所以在循环前后,移动一格,才能
读取到边界的值。
#include<iostream>
using namespace std;
const int N = 1e7 + 10;
int n;
int a[N];
void quick_sort(int a[],int l,int r)
{
if(l >= r) return ;
int x = a[(l + r ) / 2],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()
{
scanf("%d", &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;
}