[AcWing 785] 快速排序
作者:互联网
第一篇博客诶!!!
点击查看代码
#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
*/
- 注意边界的处理,防止死循环
- 递归处理左右两侧
标签:sort,785,int,区间,++,while,quick,排序,AcWing 来源: https://www.cnblogs.com/starryWJ/p/16698150.html