Live2D

排序

排序在信息学奥赛中也是一个很重要的算法,虽然可以只要会快排,走遍天下也不怕。

写个blog简单整理下学习过的排序算法。

一,STL sort

调用库函数 #include<algorithm>基本写法 sort(a+1,a+n+1) 

快速排序是一个不稳定的排序算法

对基本写法的说明:sort是对一个数组排序,其中+后面的数,分别代表下标,就是说sort会对数组a,1<=i<n+1的元素排序,sort的排序区间是左开右闭的。

库函数默认的sort是从小到大排序,但有时我们需要从大到小排序,或者给结构体排序,这时我们需要自定义一个函数cmp

1,从大到小排序

 

inline bool cmp(int x,int y)
{
    return x>y;
}

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

 

2,给结构体排序

inline bool cmp(node x,node y)
{
    return x.len<y.len;
}

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

只需要定义两个结构体变量,然后写上根据结构体哪个元素排序。

3,有时我们针对结构体多个元素排序的时候,还可以改写cmp

二,归并排序

归并排序是稳定的排序算法,时间复杂度O(nlogn)。

归并排序的详解请见分治算法的blog

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int num[2333],a[2333],n;

inline void m_sort(int l,int r)
{
    if(l==r) return;
    int mid=(l+r)>>1;
    m_sort(l,mid);
    m_sort(mid+1,r);
    int p1=l,p2=mid+1;
    for(int i=l;i<=r;i++)
    {
        if(p1<=mid&&p2<=r)
        {
            if(num[p1]<num[p2]) a[i]=num[p1++];
            else a[i]=num[p2++];
        }
        else
        {
            if(p1<=mid) a[i]=num[p1++];
            else a[i]=num[p2++];
        }
    }
    for(int i=l;i<=r;i++)
        num[i]=a[i];
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    m_sort(1,n);
    for(int i=1;i<=n;i++)
        printf("%d ",num[i]);
    return 0; 
}
归并排序

三,桶排序

桶排序的思想很好啊qwq

桶排序就是若待排序的值在一个明显的有限范围内时,可设计有限个有序桶,待排序的值装入对应的桶,

桶号就是待排序的值,顺序输出各个桶的值,得到有序的序列。

如果数据范围非常大,我们可以用HASH优化就得到了哈希表,

虽然桶排序的应用不多,但其思想应用较多。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int num[2333],a[2333],n;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&num[i]);
        a[num[i]]++;
    }
    for(int i=1;i<=1000;i++)
        while(a[i]>0)
             printf("%d ",i),a[i]--;
    return 0; 
}
桶排序

祝大家NOIP2019 RP++ SCORE++

 

posted @ 2019-08-15 05:05  Hoyoak  阅读(169)  评论(0编辑  收藏  举报