常见的排序算法——性能对比
本文汇总了笔者所写的所有“常见的排序算法”的实现,从性能特点和运行时间的角度加以了对比。
以下表格记录了笔者所写的所有“常见的排序算法”的性能特点。
算法类 | 时间复杂度 | 空间复杂度 | 是否稳定 | 备注 |
---|---|---|---|---|
Selection | N^2 | 1 | 否 | 选择排序 |
Insertion | N^2 | 1 | 是 | 插入排序,标准版。 |
Insertion2 | N^2 | 1 | 是 | 插入排序(二),标准版基础上采用了无交换的处理。 |
Bubble | N^2 | 1 | 是 | 冒泡排序,标准版。 |
Bubble2 | N^2 | 1 | 是 | 冒泡排序(二),标准版基础上缩小了比较范围。 |
Shell | N^(6/5) ? N^(5/4) ? | 1 | 否 | 希尔排序,标准版。 |
Shell2 | N^(7/6) ? N*log(N)) ? | 1 | 否 | 希尔排序(二),标准版基础上应用了更为复杂的间隔序列。 |
Merge | N*log(N) | N | 是 | 归并排序,标准版,自顶向下的两两归并排序。 |
Merge2 | N*log(N) | N | 是 | 归并排序(二),自底向上的两两归并排序。 |
Merge3 | N*log(N) | N | 是 | 归并排序(三),标准版基础上应用了:(1)小规模的插入排序;(2)检查子数组有序性;(3)减少数据复制。 |
Merge4 | N*log(N) | N | 否 | 归并排序(四),标准版基础上应用了:(1)小规模的插入排序;(2)检查子数组有序性;(3)快速归并。 |
Merge5 | N^2 | N | 否 | 归并排序(五),自底向上的自然归并排序。 |
Merge6 | N*log(N) | N | 是 | 归并排序(六),标准版基础上的多路归并排序。 |
Quick | N*log(N) | log(N) | 否 | 快速排序,标准版。 |
Quick2 | N*log(N) | log(N) | 否 | 快速排序(二),标准版基础上应用了:(1)小规模的插入排序;(2)三取样切分。 |
Quick3 | N*log(N) | log(N) | 否 | 快速排序(三),三向切分快速排序。 |
Quick4 | N*log(N) | log(N) | 否 | 快速排序(四),快速三向切分快速排序。 |
Quick5 | N*log(N) | log(N) | 否 | 快速排序(五),非递归的快速排序。 |
Heap | N*log(N) | 1 | 否 | 堆排序,标准版。 |
Heap2 | N*log(N) | 1 | 否 | 堆排序(二),标准版基础上采用了无交换的处理。 |
Heap3 | N*log(N) | 1 | 否 | 堆排序(三),标准版基础上采用了 Floyd 方法。 |
Heap4 | N*log(N) | 1 | 否 | 堆排序(四),标准版基础上应用了:(1)无交换的处理;(2)Floyd 方法。 |
Heap5 | N*log(N) | N+1 | 否 | 堆排序(五),前序表示法下的堆排序。 |
Heap6<4> | N*log(N) | 1 | 否 | 堆排序(六),标准版基础上应用多(4)叉堆排序。 |
以下表格汇总了所有的测试数据,
白色底色的数据单元为真实测试数据。蓝色区域中,O(N^2) 行的数据是以 0.006 为基数逐一乘 4 后得到的结果(因为做的是倍率实验,所以乘 (2)^2 即 4);O(N^(6/5)) 行的数据是 0.006 为基数逐一乘 2^(6/5) 后得到的结果(因为做的是倍率实验,所以乘 2^(6/5) 即 2.29);O(N*log(N)) 行的数据是 0.006 为基数逐一乘乘 2 + 2/log(N) 后得到的结果(因为做的是倍率实验,所以乘 (2*N*log(2*N)) / (N*log(N)),化简得到 2 + 2/log(N),即乘 2+2/log(1024),2+2/log(2048),2+2/log(4096),... 2+2/log(16777216),此处 log 底数取 2。
以上数据反映到以 2 为底数的对数坐标系中,得到如下图像,
从图像上可以更直观地看出各个排序算法在时间复杂度上的相似性和差异性。
受限于作者的水平,读者如发现有任何错误或有疑问之处,请追加评论或发邮件联系 green-pi@qq.com。作者将在收到意见后的第一时间里予以回复。 本文来自博客园,作者:green-cnblogs,转载请注明原文链接:https://www.cnblogs.com/green-cnblogs/p/18320358 谢谢!