快速排序模板
一、快速排序-----分治思想
1.确定分界点q[l],q[l+r/2],q[r],随机
2.调整区间以x为分界,让<=x在左边 >=x在右边
解1:
2.1 两个数组a[],b[]
2.2 q[l-r] q[i]<=x x---->a[]
q[i]>=x x---->b[]
2.3 a[]放q[],b[]放q[]
解2(双指针):
如代码
3.递归处理左右两段左右排序再拼一起
二、模板
1 void quick_sort(int q[], int l, int r) 2 { 3 if (l>=r) return; 4 int i=l-1,j=r+1,x=q[l+r>>1]; 5 while(i<j) 6 { 7 do i ++; while(q[i]<x); 8 do j --; while(q[j]>x); 9 if(i<j) swap(q[i],q[j]); 10 } 11 quick_sort(q,l,j), quick_sort(q,j+1,r); 12 } 13 14 //递归是j的话不能取到q[r] 15 void quick_sort(int q[],int l,int r){ 16 if(l>=r) return; 17 int x=q[l],i=l-1,j=r+1; 18 while(i<j){ 19 do i++;while(q[i]<x); 20 do j--;while(q[j]>x); 21 if(i<j) swap(q[i],q[j]); 22 } 23 quick_sort(q,l,j); 24 quick_sort(q,j+1,r); 25 } 26 27 28 //递归用i的话,边界不能取到q[l] 29 void quick_sort(int q[],int l,int r){ 30 if(l>=r) return; 31 int x=q[(l+r+1)/2],i=l-1,j=r+1; 32 //int x=q[(l+r)/2],i=l-1,j=r+1; 33 while(i<j){ 34 do i++;while(q[i]<x); 35 do j--;while(q[j]>x); 36 if(i<j) swap(q[i],q[j]); 37 } 38 quick_sort(q,l,i-1); 39 quick_sort(q,i,r); 40 }
三、题目链接
1.Acwing: https://www.acwing.com/problem/content/787/
2.luogu: https://www.luogu.com.cn/problem/P1177