常见的排序算法——性能对比

本文汇总了笔者所写的所有“常见的排序算法”的实现,从性能特点和运行时间的角度加以了对比。

以下表格记录了笔者所写的所有“常见的排序算法”的性能特点。

算法类 时间复杂度 空间复杂度 是否稳定 备注
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)叉堆排序。

以下表格汇总了所有的测试数据,

test_data

白色底色的数据单元为真实测试数据。蓝色区域中,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 为底数的对数坐标系中,得到如下图像,

test_graph

从图像上可以更直观地看出各个排序算法在时间复杂度上的相似性和差异性。

posted @ 2024-07-24 16:18  green-cnblogs  阅读(32)  评论(0编辑  收藏  举报