【模板】快速排序

快速排序                                                                                                                

  【传送门!!!】

  基本概念:快速排序(简称快排)可以说是对冒泡排序的一种改进,时间复杂度为O(nlog^2n)速度非常快,是目前被认为最好的一种排序方法。

  思想:通过第一趟排序将待排序记录分成独立的两部分,其中一部分记录的关键字均比另一部分的关键字要小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

  进行步骤:首先假设待排序的数列为{a[l],a[l+1],a[l+2]......a[r}。

1.任意选取一个记录(可以选取中间一个)。

2.然后重新排列其余记录小于记录的数全部放到左子序列中,大于它的数全部放到右子序列当中去。(这个记录记为mid为分界线,将序列分为两个子序列)。

  具体做法:设指针i和j,初始值分别为i=l和j=r,分别指向序列的头尾,从j开始寻找小于mid的第一个关键字,然后从i所指位置开始向后搜索,找到第i个>mid的记录,然后互相交换,然后不断重复,直到i>j为止。

  代码实现:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<ctime>
#include<cstring>
using namespace std;
int n,a[100001],len;
int main()
{
    scanf ("%d",&n);
    for (int b=1;b<=n;++b)
    {
        scanf ("%d",&a[b]);
        len=b;
        while (len!=1)
        {
            if (a[len]<a[len/2])
            {
                int t=a[len/2];
                a[len/2]=a[len];
                a[len]=t;
            }
            else break;
            len/=2;
        }
    }
    for (int b=1;b<=n;++b)
    {
        printf ("%d ",a[1]);
        a[1]=a[n-b+1];len=1;
        while(len*2<=n-b)
        {
            int next=len*2;
            if ((a[next]>a[next+1] && next<n-b))next++;
            if (a[len]<=a[next])break;
            int t=a[len];a[len]=a[next];a[next]=t;
            len=next;
        }
    }
    return 0;
}

或者是:

#include<iostream>
#include<cstdio>
#define MAXN 101
using namespace std;
int a[MAXN];
void qsort(int l,int r)
{
    int i,j,mid,p;
    i=1,j=r;
    mid=a[(l+r)/2];
    do{
        while(a[i]<mid)i++;
        while(a[i]>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);    
}
int main()
{
    int n,i;
    cin>>n;
    for(i=1,i<=n;i++)
        cin>>a[i];
    qsort(1,n);
    for(i=1;i<+n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
    
}

 

posted @ 2018-03-04 11:34  Sue_Shallow  阅读(242)  评论(1编辑  收藏  举报
Live2D