ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[AcWing 785] 快速排序

2022-09-15 22:30:21  阅读:203  来源: 互联网

标签:sort 785 int 区间 ++ while quick 排序 AcWing


第一篇博客诶!!!


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有