• 【模板】快速排序


    快速排序                                                                                                                

      【传送门!!!】

      基本概念:快速排序(简称快排)可以说是对冒泡排序的一种改进,时间复杂度为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;
        
    }
  • 相关阅读:
    【Java Web】使用URLRewrite实现网站伪静态
    Jsp的include指令静态导入和动态导入的区别
    JSP中使用cookie存储中文
    【转】android加载大量图片内存溢出的三种解决办法
    Android调整TimePicker和DatePicker大小
    使用WebClient实现通讯(Silverlight学习笔记)
    Silverlight 用户控件与自定义控件详解
    利用WebClient和WebRequest类获得网页源代码
    Silverlight中的对象序列化/反序列化
    Flex与FLASH区别及Flex动画效果学习
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/8504199.html
Copyright © 2020-2023  润新知