[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. 递归处理左右两侧
posted @   mango檸  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示