常用排序算法总结
选择排序:对于长度为N的数组,选择排序需要大约N2/2词比较和N次交换。
插入排序:对于随机排列的长度为N且主键不重复的数组:
(1)平均情况下,需要~N2/4次比较以及~ N2/4次交换。
(2)最坏情况下,需要~N2/2次比较以及~ N2/2次交换
(3)最好情况下,需要N-1次比较以及0次交换
特点:插入排序,所需的时间取决于输入中元素的初始顺序。对部分有序的数组十分高效,也很适合小规模数组。 插入排序比选择排序快一倍。
希尔排序:使用递增序列1,4,13,40,121,… (3*h + 1) 的希尔排序比较次数不会超出N的若干倍乘以递增序列的长度。
特点:(1)希尔排序高效的原因是权衡了子数组的规模和有序性(基于插入排序的)。
(2)希尔排序可用于大型数组,它对任意排序(不一定是随机的)的数组表现也很好。
(3)希尔排序比插入排序和选择排序要快得多,并且数组越大,优势越大。
归并排序: 最坏情况下的比较次数为NlgN
特点:(1)最大的优点是他能够保证任意长度为N的数组排序所需要的时间和NlgN成正比;主要缺点是他所需的额外空间和N成正比。
(2)可以使用归并排序处理百万甚至更大规模的数组。(说明:插入排序很可能在小数组上比归并更快)
快速排序:原地排序(只需要一个很小的辅助栈),且将长度为N的数组排序所需的时间和NlgN成正比。
特点:(1)比较次数少,而且内循环中不需要移动元素。
(2)不适合含有大量重复元素的数组。
堆排序:将N个元素排序,堆排序只需要少于(2NlgN+2N)次比较(以及一半次数的交换)。
特点:(1)它是唯一能同时最优利用空间和时间的方法,当空间十分紧张时,用堆排序比较合适。
(2)缺点无法利用缓存。因为堆排序中数组元素很少与其他相邻元素进行比较,因此缓存未命中率要远远高于大多数比较都在相邻元素间进行的算法,如快 速排序,归并排序,甚至是希尔排序。