快速排序【模板】

测评传送门

真正意义上学会快排,以前一直调的sort…… 但毕竟能手写就手写,对自己也是一种锻炼

解析:

快排说白了就是把要排的一行数切成一半,记录下中间值,在左半部分找到比中间值大的(记d1),再在右半部分找到比中间值小的(记d2)

如果d1在d2的左边,就交换他们,d1后推一格,d2前推一格,继续快排

 

#include<stdio.h>
using namespace std;
int a[100001];

void fast(int l,int r)
{
    int i,j,mid,p;
    i=l,j=r;    
    mid=a[(l+r)>>1];
    do
    {
        while(a[i]<mid) i++;
        while(a[j]>mid) j--;
        if(i<=j)
        {
            p=a[i];
            a[i]=a[j];
            a[j]=p;
            i++,j--;
        }
    }while(i<=j);
    if(l<j) fast(l,j);
    if(i<r) fast(i,r);
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    fast(1,n);
    for(int i=1;i<=n;++i){
        printf("%d ",a[i]);
    }
    return 0;
}

 

posted @ 2018-08-04 20:45  qseer  阅读(152)  评论(0编辑  收藏  举报