快速排序模板
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 指针时 要在区间的前后位置,因为指针
这里移动是先往后移动一格再按条件交换,所以在循环前后,移动一格,才能
读取到边界的值。
1 #include<iostream> 2 using namespace std; 3 4 const int N = 1e7 + 10; 5 int n; 6 int a[N]; 7 8 void quick_sort(int a[],int l,int r) 9 { 10 if(l >= r) return ; 11 int x = a[(l + r ) / 2],i = l - 1,j = r + 1; 12 while(i < j) 13 { 14 do i ++;while(a[i] < x); 15 do j --;while(a[j] > x); 16 if(i < j) swap(a[i],a[j]); 17 18 } 19 quick_sort(a,l,j); 20 quick_sort(a,j + 1,r); 21 } 22 int main() 23 { 24 scanf("%d", &n); 25 for(int i = 0;i < n; i++) scanf("%d", &a[i]); 26 27 quick_sort(a, 0, n - 1); 28 29 for(int i = 0;i < n; i ++) printf("%d ", a[i]); 30 31 return 0; 32 }