快速排序
tips:
分治思想的应用:
用O(n)的时间先分成两半,然后左半边快排,右半边快排
数组排序任务可以如下完成:
1)设k=a[0], 将k挪到适当位置,使得比k小的元素都
在k左边,比k大的元素都在k右边,和k相等的,不关心
在k左右出现均可 ( O( n)时间完成)---奇偶次交换
2) 把k左边的部分快速排序
3) 把k右边的部分快速排序
1.快排有好多种实现方式
2.用快排算法变形来做的题好像只有求第k大数了?待补
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e6+10;
int n;
int q[N];
void quick_sort(int q[],int l, int r){
if(l >= r) return ;
int k=q[l];
//单独存下k,比较的标杆定值,可以避免考虑随着交换而移动
//a[i]或者a[j]中始终有一个为k
int i = l, j = r;//指针i、j;指针指示位置
/*
动i还是j:看有序区间而定,目的是k的左边比k小,k的右边比k大
*/
while(i != j){
while(j > i && q[j] >= k )
--j;
swap(q[i],q[j]);
while(i < j && q[i] <= k )
++i;
swap(q[i],q[j]);
}//处理完后,a[i]=k;
quick_sort(q,l,i-1);
quick_sort(q,i+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;
}
备忘:可以看mooc和yxc温习