排序:
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、冒泡排序(同等于sort函数)
冒牌排序就是最简单、但搜索次数极多的“暴力搜索”。冒泡排序只和不停地找其它数据和自己进行比较然后互换,适合在需要排序的数据比较少的时候使用这种排序。当然,排序量过大,时间超限不是问题。这伪代码还用放吗?应该都知道吧?我们来看看时间复杂度:
这个时间复杂度最坏的情况下有个争议。有人说O(n^2),有人说O[n*(n-1)/2]。这里我要强调:时间复杂度应该是O[n*(n-1)/2],前者复杂度一般程序效率多余或程序有误。最好情况O(n)。
3、哈希排序(桶排序)
哈希排序适用于所有需要排序的数据比较小的时候使用这种排序。只要知道要排序的数据的大小,就可以定一个数组(桶),来存所有数据。这里我们开始打比方。
现在你有10个桶,你需要排序的一个最大数据是10。你走到第一个桶前,然后把所有手中的1都放进去。然后走到第二个桶,把所有手中的2都放进去……然后走到第10个桶,把所有手中的10都放进去。你手中已经没有需要排序的数据了。现在你回到第一个桶,从第一个通道第十个桶,开始依次报出每个桶里的数据。就这样,我们通过“桶”完成了排序。
来看看时间复杂度:
桶排序无论什么情况下时间复杂度都是O(m+n),m代表所有个桶里的数据数量。效率是不是非常高?可惜,这种算法空间效率特别低。如果只有10个数排序,而每个数高达1亿,那么你就得开个下标1亿的数组!占几十万甚至几百万KB很有可能!所以我们要因题而异,选择算法。
4、快速排序(同等于quicksort函数)
这个方法不牺牲空间,时间效率可以根据情况而异,而且时间复杂度普遍比冒泡排序小。我们还是要比方比方啦!
现在一串数上有两个士兵,分别从数据两头出发。首先最右边的哨兵往左走,此时最左边的哨兵站在一个数上,