快速排序模板

一、快速排序-----分治思想
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

posted on 2020-10-25 16:39  恒晨  阅读(142)  评论(0编辑  收藏  举报

导航