zoukankan      html  css  js  c++  java
  • 【模板】快速排序

    快速排序                                                                                                                

      【传送门!!!】

      基本概念:快速排序(简称快排)可以说是对冒泡排序的一种改进,时间复杂度为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;
        
    }
  • 相关阅读:
    uva 1362(区间dp+计数)
    uva 11174(排列组合+搜索)
    简单递推系列 uva习题
    基本计数方法系列 uva习题
    Codeforces Round #209 (Div. 2) Problem A Table(找规律)
    CodeChef November Challenge 2013 解题报告
    2012 chengdu现场赛 Browsing History HDU4464(简单字符串)
    CodeChef TechFest 2013 Cool Numbers(搜索)
    CodeChef Inscription 2013 Wonderland jewellery(简单题)
    页面滚动marquee标签
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/8504199.html
Copyright © 2011-2022 走看看