排序

· · 题解

// luogu.1177 今天我来给大家介绍luogu.1177的其他用法。\ 首先,sort的基本用法------递增法,下面是程序。

#include <bits/stdc++.h>

using namespace std;

int a[100005];

int main()
{
    int n;
    cin>>n;

    for (int i=1;i<=n;++i)
        cin>>a[i];

    sort(a+1,a+n+1);

    for (int i=1;i<=n;++i)
        cout<<a[i]<<" "; 
}

输入: 5 1 7 2 -1 6 输出: -1 1 2 6 7

很显然,这个排序不咋地(只能解决简单问题)。

第二种,下降法,下面是程序。

#include <bits/stdc++.h>

using namespace std;

int a[105];

int cmp(int a,int b){
    return a>b; 
}

int main()
{
    int n;
    cin>>n;

    for (int i=1;i<=n;++i)
        cin>>a[i];

    sort(a+1,a+n+1,cmp);

    for (int i=1;i<=n;++i)
        cout<<a[i]<<" "; 
}

输入: 5 1 7 2 -1 6 输出: 7 6 2 1 -1

以上就是基本的sort快排用法当然这不是最快的(最差O(n^2))

优先级队列是个有用的东西,在这题中也适用。

#include <bits/stdc++.h>

using namespace std;

priority_queue<int,vector<int>,greater<int> >q;
int n,x;

int main()
{
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>x;
        q.push(x);
    }

    while(!q.empty()){
        cout<<q.top()<<' ';
        q.pop();
    }
    return 0;
}

桶排不是很常见,但是他的时间复杂度为O(n logn)

#include <bits/stdc++.h>

using namespace std;

int a[100005],i,temp;

void heap(int nn,int ii){
    int x,i,j;
    i=ii;          
    x=a[ii];    
    j=2*ii;    
    while (j<=nn){    
        if (j<nn && a[j]<a[j+1])   
            j++;
        if (x<a[j]){ 
            a[i]=a[j];  
            i=j;   
            j=2*i;   
        } 
        else 
            j=nn+1;  
    }  
    a[i] = x; 
}

int main()
{
    int n;
    cin>>n;

    for (i=1;i<=n;++i)
       cin>>a[i];

    for (i=n/2;i>=1;i--) 
        heap(n,i);

    for (i=n;i>=2;i--){
        swap(a[1],a[i]);
        heap(i-1,1);
    }
    for (i=1;i<=n;i++) cout<<a[i]<<" ";
}