其他分享
首页 > 其他分享> > [AcWing 785] 快速排序

[AcWing 785] 快速排序

作者:互联网

第一篇博客诶!!!


image


点击查看代码
#include<iostream>

using namespace std;

const int N = 100010;

int n;
int q[N];

void quick_sort(int q[], int l, int r){
    if(l >= r) return; //只有一个数或者没有数时则不用去遍历了
    
    //int x = q[l]; //会超时 有两组数据不通过
    int x = q[(l+r)>>1]; //确定分界点x 
    int i = l-1, j = r+1; //两个指针i和j先放到边界的左右两侧
    while(i < j){ //每次迭代(每次移动和交换 算一次迭代)
        do{
            i++;
        }while(q[i] < x); //i从左向右走
        do{
            j--;
        }while(q[j] > x); //j从右向左走
        if(i < j) swap(q[i], q[j]); //交换i和j所指向的数
    }
    quick_sort(q, l, j);
    quick_sort(q, j+1, r);
}

int main(){
    scanf("%d", &n); //输入更快一些
    for(int i = 0; i < n; i++)
        scanf("%d", &q[i]);
        
    quick_sort(q, 0, n-1);
    
    for(int i = 0; i < n; i++)
        printf("%d ", q[i]);
    
    return 0;
}

/*听课记录:

快速排序
基于分治的思想
1. 确定分界点x:取法有 q[l] 、q[(l+r)/2]、 q[r] 、 随机 四种方式
2. 调整区间:使左边区间中的数都<=x,右边区间中的数都>=x(重点!)
3. 递归处理左右两段

调整区间的一种方法(暴力做法 需额外的空间)(时间上线性)
1. a[] b[]
2. q[l~r]: q[i]<=x,x->a[]; q[i]>x,x->b[];
3. a[]->q[]; b[]->q[];

调整区间的一种优美的做法:
|__________________________|
L                          R
i                          j
 ---> i              j <---
i从左向右走,i所指值小于x则继续走,i所指值大于x则停下
j开始从右向左走,j所指值大于x则继续走,j所指值小于x则停下
交换i和j所指向的数 使用swap函数
i和j分别向右和向左移动一位
i继续开始走...
重复过程 直至i和j相遇或穿过为止
其中任一时刻,i左边的数都小于x,j右边的数都大于x
*/


  1. 注意边界的处理,防止死循环
  2. 递归处理左右两侧

标签:sort,785,int,区间,++,while,quick,排序,AcWing
来源: https://www.cnblogs.com/starryWJ/p/16698150.html