直接插入排序、希尔排序、堆排序的比较

来源:互联网 发布:linux运行程序命令gcc 编辑:程序博客网 时间:2024/06/05 02:52

直接插入排序、希尔排序、堆排序

1、之所以把三个排序算法放在一块,是因为他们有相似之处,希尔排序和堆排序都是类似于插入排序,只不过希尔排序是跳着插(按照步长),堆排序是在树中的某一条路径上插。

稳定性:首先,排序算法的稳定性通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果A= B, A原来在位置前,排序后A还是要在B位置前。

2、三种不同插入的比较

     (1)直接插入

  如:2 8 5 4 7 6

  第一次:2 8       5 4 3 6

第二次:2 5 8    4 3 6

第三次:2 4 5 8 3 6

第四次:把3查到前面的序列中,把3取出来,3原来的位置便是一个坑,从8到

2一次与3比较,若大于3则填补坑。如:8比3大,8把3的坑填了,8原来

的位置又有了一个坑。记住这个插入规则。

          最好时间:O(N)。如果数组事先是排好序的,那么只遍历一次数组,对于

遍历的每一个元素也只与前面的元素比较一次。

最坏时间/平均时间:O(N^2)。

直接插入排序是一种稳定的算法。适用于小规模数据。

     (2)希尔排序

          解析:希尔排序是跳着插,希尔是按照步长排序的,最后一个步长为1,等同

于直接插入排序,但此时由于大部分已经排好序了,所有时间复杂的并不是很

高。

如:步长为3时,数组为2 8 5 4 7 6 9 1。那么对每一次数遍历,如第一个元素

2时,我们要对2    4    9进行直接插入排序,也就是之前说的跳着插。之后对

8、5、4、7进行同样的跳着插排序,对于元6、9、1来说,步长不足3,故不

再往后遍历。

说明:步长在很大程度上影响了希尔的效率,这也导致希尔排序并不是一种稳

定的排序算法,不过希尔排序已经在直接插入排序上有所提高。适用于小规模

数据。

     (3)堆排序(以最小堆为例)

说明:堆排序可谓是一种非常快的排序算法,其插入和删除的时间复杂度皆为

O(lgN),对于N个元素排序,时间复杂度为O(NlgN)。如此高效的特点使

得其适用于大规模数据的排序。

堆是一颗完全二叉树,可用数组来表示,假设下标0存储根节点,若父节点

下标为i,那么其左儿子下标为2i+1,右儿子下标为2i+2。

解析:对于了解堆排序的同学并不陌生,构建堆之后,堆排序是从最后一个父

节点(标记为A)开始的,A节点的较小儿子等同于直接插入排序中的下标为0

的节点,堆得根节点等同于末尾节点,每条支路对应于一个直接插入排序,类

似于希尔排序按步长分组。

0 0