基础排序算法

Posted majorin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础排序算法相关的知识,希望对你有一定的参考价值。

排序算法(一)

计数排序

计数排序应该是最简单的排序算法了吧。

基本思想

计数排序运用了桶排序的思想,于是我们就现来讲讲桶排序:

(第一次画图,经验不足,请谅解)

技术图片

桶排序的思想用语言来表述就是:

将数按值的大小放进几个表示数的范围的桶中,在每个桶中风别再做排序,最后从前向后合并。

但是,桶排序只是将原问题分解,变成小问题,再解决,实际上它是一种思想,一种将问题简化的方法。

在桶中将序列有序化就应该用更具体的算法了。

而计数排序就是桶大小为1的桶排序

    memset(a,0,sizeof(a));
    int n,sum;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {scanf("%d",&sum);a[sum]++;}
    for(int i=1;i<=n;++i)
    for(int j=1;j<=a[i];++j)
    printf("%d ",i);
优点

主要是快,即时间复杂度小,为(O(n + a)),其中a为数值范围,大概是最快的排序算法了

缺点

所占内存过大,即空间复杂度大,为(O(a)), a超过大概(5*10^7)就爆内存了

简单选择排序

简单选择排序是最为自然的排序之一

基本思想

待排序序列中的最值取出,放入有序序列

    int i,j,n,mindex,mini=0;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>qu[i];
    for(i=1;i<=n;i++)
    {
        mindex=999999;
        for(j=i;j<=n;j++)
        if(mindex>qu[j]) {mindex=qu[j];mini=j;}
        swap(qu[i],qu[mini]);
    }
    for(i=1;i<=n;i++)
    cout<<qu[i]<<" ";

直接插入排序

很常见的排序算法,就是我们在理牌时,用的排序方式

基本思想

待排序序列中的第一个数取出,放入有序序列中相应的位置,

使有序序列依旧有序。

for (int i=2;i<=n;i++)
    {
        int now=qu[i],j;
        for (j=i-1;j>=1;j--)
            if(qu[j]>now) qu[j+1]=qu[j];
            else break;
        qu[j+1]=now;
    }
    for(int i=1;i<=n;i++)
    cout<<qu[i]<<" ";

冒泡排序

冒泡排序故名思义,排序的过程就像是泡泡上升

基本思想

通过不断消除相邻的逆序数对使数到达相对有序的位置

 int n,i,j;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    for(i=1;i<=n-1;i++)
    for(j=1;j<=n-i;j++)
    if(a[j]>a[j+1]) swap(a[j],a[j+1]);
    for(i=1;i<=n;i++)
    cout<<a[i]<<" ";

总结

对于以上排序因为其过大的时间复杂度或者空间复杂度,造成其对使用的影响比较大,所以用处不大,

但是这些算法是更加高效的排序算法的基础,而且对于培养我们的思维非常有好处。

下一节,会讲运用了递归分治思想的快速排序和归并排序。

以上是关于基础排序算法的主要内容,如果未能解决你的问题,请参考以下文章

排序算法基础总结

排序算法基础总结

7.2堆排序的代码分析(算法基础—排序算法)

三大基础排序算法(冒泡排序,选择排序,插入排序)

算法基础(面试)

基础排序算法综述