排序算法汇总

这里记录一下各种排序算法的比较和特性,主要摘自维基百科

稳定的

不稳定

不实用的排序算法

  • Bogo排序 — O(n × n!),最坏的情况下期望时间为无穷。
  • Stupid sort — O(n3); 递归版本需要 O(n2) 额外存储器
  • 珠排序(Bead sort) — O(n) or O(√n), 但需要特别的硬件
  • Pancake sorting — O(n), 但需要特别的硬件

平均时间复杂度

平均时间复杂度由高到低为:

说明:虽然完全逆序的情况下,快速排序会降到选择排序的速度,不过从概率角度来说(参考信息学理论,和概率学),不对算法做编程上优化时,快速排序的平均速度比堆排序要快一些。

实际测试结果

OS: winxp, Compiler: vc8, CPU:Intel T7200,  Memory: 2G
不同数组长度下调用6种排序1000次所需时间(秒)

length          shell           quick           merge           insert          select          bubble
100             0.0141          0.359           1.875           0.204           0.313           0.421
1000            0.218           0.578           2.204           1.672           2.265           4
5000            1.484           3.25            14.14           41.392          63.656          101.703
10000           3.1             7.8             23.5            253.1           165.6           415.7
50000           21.8            40.6            121.9           411.88          6353.1          11648.5
100000          53.1            89              228.1           16465.7         25381.2         44250


结论:
数组长度不大的情况下不宜使用归并排序,其它排序差别不大。
数组长度很大的情况下Shell最快,Quick其次,冒泡最慢。

简要比较

名称数据对象稳定性时间复杂度空间复杂度描述
平均最坏
插入排序数组、链表《排序算法汇总》O(1)(有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。对数组:比较得少,换得多。
直接选择排序数组×《排序算法汇总》O(1)(有序区,无序区)。在无序区里找一个最小的元素跟在有序区的后面。 对数组:比较得多,换得少。
链表
堆排序数组×O(nlogn)O(1)(最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。
归并排序数组、链表O(nlogn)O(n) +O(logn) , 如果不是从下到上把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行。
快速排序数组×O(nlogn)《排序算法汇总》O(logn) ,O(n)(小数,枢纽元,大数)。
Accum qsort链表O(nlogn)《排序算法汇总》O(logn) ,O(n)(无序区,有序区)。把无序区分为(小数,枢纽元,大数),从后到前压入有序区。
  
决策树排序 O(logn!)O(n!)O(n) <O(logn!) <O(nlogn)
  
计数排序数组、链表O(n)O(n+m)统计小于等于该元素值的元素的个数 i,于是该元素就放在目标数组的索引 i位。(i≥0)
桶排序数组、链表O(n)O(m)将值为 i 的元素放入i 号桶,最后依次把桶里的元素倒出来。
基数排序数组、链表O(k*n),最坏:O(n^2) 一种多关键字的排序算法,可用桶排序实现。
  • 均按从小到大排列
  • k 代表数值中的”数位”个数
  • n 代表数据规模
  • m 代表数据的最大值减最小值

 


  排序算法
 
理论 计算复杂性理论 |  大O符号 |  全序关系 |  列表 |  稳定性 |  比较排序 |  拓扑排序 |  排序网络《排序算法汇总》
 
交换排序法 冒泡排序 |  鸡尾酒排序 |  奇偶排序 |  梳排序 |  侏儒排序 |  快速排序 | 臭皮匠排序 |  Bogo排序
 
选择排序法 选择排序 |  堆排序 |  Smooth排序 |  笛卡尔树排序 |  锦标赛排序 |  循环排序
 
插入排序法 插入排序 |  希尔排序 |  二叉查找树排序 |  图书馆排序 |  Patience排序
 
归并排序法 归并排序 |  多相归并排序 |  Strand排序
 
分布排序法 美国旗帜排序 |  珠排序 |  桶排序 |  爆炸排序 |  计数排序 |  鸽巢排序 |  相邻图排序 |  基数排序 |  闪电排序
 
混合排序法 Tim排序 |  内省排序 |  Spread排序 |  反移排序 |  J排序
 
其他 双调排序器 |  Batcher归并网络 |  两两排序网络
    原文作者:WhoAmMe
    原文地址: https://www.cnblogs.com/whoamme/archive/2013/01/23/2874089.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞