休息了一个月多,开始学习了
记录一下Acwing的学习过程
快速排序思想
使用分治的思想
- 确定分界点:可以随机选取
- 调整区间:即将比分界点大的数移到右边,比分界点小的数移到左边
- 递归:分别对两个区间进行调整操作
重点在于调整区间的过程
一般有两种操作:
- 开额外的两个数组,然后对需要排序的区间进行扫描,大于X的放在一个数组中,小于X的放在另一个数组中,最后合并到一起。
- 双指针操作:
将两个指针i,j分别指向一段区间的开头和结尾,如果i指向的数字大于X,那么就停止,否则i++。如果j指向的数小于X,那么就停止,否则j–。当两个都停止了,就交换位置(注意要判断一下此时i<j)。
当移动到i>=j时候,就退出。
注意这两个判断
if(i<j){ swap(q,i,j); i++;j--; } if(i==j){ if(q[i]>x){ j++; }
#include<iostream>
using namespace std;
const int N=1e5+10;
int q[N];
int n;
void swap(int q[],int a, int b){
int tmp;
tmp=q[a];
q[a]=q[b];
q[b]=tmp;
}
void quick_sort(int q[],int l, int r){
//l,r是所需要排序的端点
if(l>=r)
return;
int x=q[(l+r)/2],i=l,j=r;
while(i<j){
while(q[i]<x)
i++;
while(q[j]>x)
j--;
if(i<j){
swap(q,i,j);
i++;j--;
}
if(i==j){
if(q[i]>x){
j++;
}
}
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>q[i];
quick_sort(q,1,n);
for(int i=1;i<=n;i++)
cout<<q[i]<<' ';
return 0;
}