- 快速排序
快速排序
思路:找一个数为标准,其余数和他进行比较,进行位置交换,进行排序
以升序为例,我们选取中间值为标准,小于中间值的就就换到左边大于中间值的就换到右边
acwing模板
#include<iostream>
using namespace std;
const int N=1000010;
void quick_sort(int q[],int l,int r){
if(l>=r) return;
int i=l-1,j=r+1,x=q[l+r>>1];
while(i<j){
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int a[N];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
quick_sort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
理解:
void quick_sort(int q[],int l,int r){
//左边大于等于右边明显不符合我们的判断,递归终止
if(l>=r) return;
//我们需要重新定义i和j,
//因为下面我们的dowhile循环会一开始++、--,
//所以我们这里先+和-,以免漏掉数组第一个和最后一个
int i=l-1,j=r+1,x=q[l+r>>1];
//如上图所示,当两边数都遍历完成之后两种情况(数组长度为奇数或者偶数)
while(i<j){
//判断左边,因为小于就不用换位置
//所以我们一直判断出一个大的
do i++; while(q[i]<x);
//判断右边,大于就不用换位置
//找出一个小的
do j--; while(q[j]>x);
//换位置,这样两边各自不符合位置的,一交换都符合位置了
if(i<j) swap(q[i],q[j]);
}
//此时,数组左边的都是小于中间值的,右边都是大于中间值的
//此时整体就是一个递增
//我们继续以同样的方式判断左边和右边,递归结束,则排序完成
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}