【分治】简单说说快排

说到快拍,大家都会首先想到sort函数这个神奇的东西

但是,我们总得知道快拍主要用的分治思想

所以就说一说快拍吧

首先是分类

快拍主要有三种方式:

一、以第一个数为基准排序

二、以中间的数为基准快排

三、随机生成一个位置,用这个位置上的数快排

代码如下:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int n,a[2000002];

/*int rrand(int l,int r)                      //三中用于生成随机位置
{
    srand((unsigned)time(NULL));
    return (int)(rand()%(r-l+1)+l);
}*/

void qsort(int l,int r)                       //以中间的数为基准快排
{
    int i,j,mid,p;
    i=l;j=r;
    mid=a[(l+r)/2];
    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) qsort(l,j);
    if(i<r) qsort(i,r);
}

/*void qsort(int l,int r)                                 //随机&首位快排
{
    int i=l,j=r+1,temp=rrand(l,r),k=0;       //首位的话是temp=a[i]
    if(r-l<2) return;
    while(i<j)
    {
        while(i<j)
        {
            j--;
            if(a[j]<temp)
            {
                swap(i,j);
                break;
            }
        }
        while(i<j)
        {
            i++;
            if(a[i]>temp)
            {
                swap(i,j);
                break;
            }
        }
    }
    a[i]=temp;
    qsort(l,i);
    qsort(i+1,r);
}
*/ 
int main()
{
    freopen("sorttest.in","r",stdin);
    freopen("sorttest.out","w",stdout);
    
    scanf("%d",&n);
    for(int i=n;i>=1;i--) scanf("%d",&a[i]);
    /*sort(a+1,a+n+1);                                   //喜闻乐见的sort
    for(int i=1;i<=n;++i)printf("%d ",a[i]);
    */
    qsort(1,n);
    for(int i=1;i<=n;++i)printf("%d ",a[i]);
    fclose(stdout);
    return 0;
}

 

posted @ 2017-05-07 20:11  减维  阅读(230)  评论(0编辑  收藏  举报