• 排序论


    排序:

    1、插入排序

         首先说说插入排序。都知道插入排序是什么吗?假如你和朋友在玩牌,牌扣在桌上,我们手上没有牌。然后,我们每次从桌子上拿走一张牌并将它插入手中正确的位置。为了找到牌的正确位置,我们需要把目前所有牌搜索一遍。

         给出伪代码(从小到大):

    int insertion-sort()
    {
        for(j=2;j<=n;j++)
        {
            key=a[j];
            //插入j进入排序序列
            i=j-1;
            while(i>0 && a[i]>key)
            {
                a[i+1]=a[i];
                i--;
            }
            a[i+1]=key;
        }
    }
    

      这里我们先不定义任何数据。其实已经能理解了:先把要插入的数存入key,然后搜索现在已有的每一个数,只要数比它大,就一直搜下去。找到比它小的数,就插进去。我们推断出了这个算法是正确的,如果从大到小排序,相信大家都知道怎么办了吧!把while循环稍作变动:a[i]>key 改成a[i]<key即可。

         掺和一下时间复杂度:同冒泡排序时间复杂度

    2、冒泡排序

         冒牌排序就是最简单、但搜索次数极多的“暴力搜索”。冒泡排序只用相邻的数和自己进行比较然后判断互换,适合在需要排序的数据比较少的时候使用这种排序。当然,排序量过大,时间超限不是问题。这伪代码还用放吗?应该都知道吧?我们来看看时间复杂度:

         这个时间复杂度最坏的情况下有个争议。有人说O(n^2),有人说O[n*(n-1)/2]。这里我要强调:时间复杂度应该是O[n*(n-1)/2],前者复杂度一般程序效率多余或程序有误。最好情况O(n)。

    3、选择排序(这个自己上网查吧,也很耗时)

    4、哈希排序(桶排序)

         哈希排序适用于所有需要排序的数据比较小的时候使用这种排序。只要知道要排序的数据的大小,就可以定一个数组(桶),来存所有数据。这里我们开始打比方。

         现在你有10个桶,你需要排序的一个最大数据是10。你走到第一个桶前,然后把所有手中的1都放进去。然后走到第二个桶,把所有手中的2都放进去……然后走到第10个桶,把所有手中的10都放进去。你手中已经没有需要排序的数据了。现在你回到第一个桶,从第一个通道第十个桶,开始依次报出每个桶里的数据。就这样,我们通过“桶”完成了排序。

         来看看时间复杂度:

         桶排序无论什么情况下时间复杂度都是O(m+n),m代表所有个桶里的数据数量。效率是不是非常高?可惜,这种算法空间效率特别低。如果只有10个数排序,而每个数高达1亿,那么你就得开个下标1亿的数组!占几十万甚至几百万KB很有可能!所以我们要因题而异,选择算法。

    5、杂排(差不多等于sort函数)

    6、快速排序(差不多等于quicksort函数)

         这个方法不牺牲空间,时间效率可以根据情况而异,而且时间复杂度普遍比冒泡排序小。我们还是要比方比方啦!

        现在一串数上有两个士兵,分别从数据两头出发。首先最右边的哨兵往左走,此时最左边的哨兵站在一个数上,

     (暂时到这里之后抽空再写吧~)

  • 相关阅读:
    软工随堂小测——四则运算
    K米测评
    uml用例图
    第二次结对编程作业——毕设导师智能匹配
    原型设计与需求分析
    散列函数的应用及其安全性
    Think In Java读书笔记:内部类覆盖及其初始化
    如何在服务器(centOS系统)上运行JavaWeb项目
    结对工程作业
    《构建之法》——第四、第十七章
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/paixulun.html
Copyright © 2020-2023  润新知