快排的本质是分治。
快排的一般思路:
- 选择一个标准点x
- 使数组左边的都比x小,右边的都比x大
- 递归处理左右数组
给出一个优美的快排模版:
#include <iostream>
using namespace std;
const int maxn = 1e5+7;
int a[maxn];
void quick_sort(int l,int r){
if(l>=r){
return;
}
int i = l-1, j = r+1, x = a[(l+r)/2];
while(i<j){
do i++; while(a[i]<x);
do j--; while(a[j]>x);
if(i<j) swap(a[i],a[j]);
}
quick_sort(l,j);
quick_sort(j+1,r);
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
quick_sort(0,n-1);
for(int i=0;i<n;i++) printf("%d ",a[i]);
}
注意点:
- 递归结束阶段,判断为左边界大于等于右边界
- i,j初值往边上靠一位,方便do while(即不管咋样,i,j先加减一)
- 递归边界处理:如果向下递归的为j,j+1,则选点不能为r;向下递归为i-1,i,则选点不能为l
快排的边界情况较多,需要注意判别。
如果不记得模版了,用两个数组暂存下也行。。。。