排序论

排序:

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函数)

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

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

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

原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/paixulun.html