排序

24 阅读2分钟
  • 快速排序

快速排序

思路:找一个数为标准,其余数和他进行比较,进行位置交换,进行排序

以升序为例,我们选取中间值为标准,小于中间值的就就换到左边大于中间值的就换到右边

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;
    
}

CA5B559852F455AADD09E484080D18C7.png 理解:

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);
}