题解 P1177 【【模板】快速排序】

· · 题解

基础的排序题

很水很水的

先说下思路吧

1.快速排序(题目要求手打 然而我并不想手打)

快速排序是一种基于二分思想的算法,复杂度为 O( n*log2(n) )

然后如果遇到毒瘤出题人的话(给你一个本身就有序(或者趋近于有序)的序列),那么你的快速排序就会退化成 O( n^2 )的复杂度

STL之sort版:

#include<bits/stdc++.h>//万能头(贼爽,但别把变量名设成其他关键字) 
#define F(i,n,m) for(int i=n;i<=m;i++)//灵性define,减少码量(for打得我烦) 
using namespace std;
int a[10000001];
int main()
{
    int n;
    cin>>n;
    F(i,1,n)
    cin>>a[i];//输入 

    random_shuffle(a+1,a+n+1); //打乱它 
    sort(a+1,a+n+1);//快排(终究我还是用了STL的sort) 

    F(i,1,n)
    cout<<a[i]<<' ';//输出 
    return 0;
}

二分手打sort:

#include<bits/stdc++.h>
#defind F(i,n,m) for(int i=n;i<=m;i++)
using namespace std;
int n,a[1000001];
void mysort(int l,int r)//自己写的快排 
{
    int mid=a[(l+r)/2];//找中间的数进行2分 
    int i=l,j=r;
    do{
        while(a[i]<mid)
        i++;//找左半部分大于中间数的 
        while(a[j]>mid)
        j--;//找右半部分小于中间数的 
        if(i<=j)
        {
            swap(a[i],a[j]);//换位 
            i++;//左指针右移 
            j--;//右指针左移 
        }
    }
    while(i<=j);
    if(l<j) mysort(l,j);
    if(i<r) mysort(i,r);
}
int main()
{
    cin>>n;
    F(i,1,n)
    cin>>a[i];
    random_shuffle(a+1,a+n+1); //打乱它 
    mysort(1,n);//快排 
    F(i,1,n)
    cout<<a[i]<<' ';//输出 
    return 0;
}

2.堆排序(STL大法好)

#include<bits/stdc++.h>
#define F(i,n,m) for(int i=n;i<=m;i++)
using namespace std;
int main()
{
    priority_queue<int,vector<int>,greater<int> > q;//小根堆
    int n,x;
    cin>>n;
    F(i,1,n)
    {
        cin>>x;
        q.push(x);
    }
    F(i,1,n)
    {
        cout<<q.top()<<' ';
        q.pop();
    }
    return 0;
}

3.桶排序

理论上来说,桶排序所要占用的空间很大,所以我们可以用STL容器中的毒瘤数据结构map来做(相当于动态开筒)

上代码:

#include<bits/stdc++.h>
#define F(i,n,m) for(int i=n;i<=m;i++)
using namespace std;
int main()
{
    map<int,int> a;
    int n;
    cin>>n;
    F(i,1,n)
    {
        int x;
        cin>>x;
        a[x]++;
    }
    map<int,int>::iterator it=a.begin();
    for(it;it!=a.end();it++)
    {
        aa:;
        if(it->second==0) continue;
        cout<<it->first<<' '; it->second--; goto aa;
    }
    return 0;
}

完结了,这么好的题解您不赞一个嘛 ^_^