经典排序算法比较|青训营笔记

99 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

1、十大经典排序算法

排序算法是《数据结构与算法》中最基本的算法之一,相信大家都很熟悉了,用一张表格概括他们的特性:

排序算法平均时间复杂度最好情况最坏情况空间复杂度稳定性
冒泡排序O(n2)O(n^2)O(n)O(n)O(n2)O(n^2)O(1)O(1)稳定
选择排序O(n2)O(n^2)O(n2)O(n^2)O(n2)O(n^2)O(1)O(1)不稳定
插入排序O(n2)O(n^2)O(n)O(n)O(n2)O(n^2)O(1)O(1)稳定
希尔排序O(nlogn)O(n·logn)O(nlog2n)O(n·log^2n)O(nlog2n)O(n·log^2n)O(1)O(1)不稳定
归并排序O(nlogn)O(n·logn)O(nlogn)O(n·logn)O(nlogn)O(n·logn)O(n)O(n)稳定
快速排序O(nlogn)O(n·logn)O(nlogn)O(n·logn)O(n2)O(n^2)O(nlogn)O(n·logn)不稳定
堆排序O(nlogn)O(n·logn)O(nlogn)O(n·logn)O(nlogn)O(n·logn)O(1)O(1)不稳定
计数排序O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)O(k)O(k)稳定
桶排序O(n+k)O(n+k)O(n+k)O(n+k)O(n2)O(n^2)O(n+k)O(n+k)稳定
基数排序O(nk)O(n·k)O(nk)O(n·k)O(nk)O(n·k)O(n+k)O(n+k)稳定

2、实际场景Benchmark

在实际场景中运用排序算法,往往会根据序列元素排列情况划分

  • 完全随机的情况 (random)
  • 有序/逆序的情况 (sorted/reverse)
  • 元素重复度较高的情况 (mod8) 在此基础上,还需要根据序列长度的划分 (16/128/1024)

插入排序、快速排序、堆排序各有特点,在后面的笔记中对比了上述情况下三种排序的效率 image.png

2.1 benchmark-random

image.png

  • 插入排序在短序列中速度最快
  • 快速排序在其他情况中速度最快
  • 堆排序速度于最快算法差距不大

2.2 benchmark-sorted

image.png

  • 插入排序在序列已经有序的情况下最快

2.3 结论和思考

  • 所有短序列和元素有序情况下,插入排序性能最好
  • 在大部分的情况下,快速排序有较好的综合性能
  • 几乎在任何情况下,堆排序的表现都比较稳定

思考:那么我们可不可以结合三种排序算法的优势实现一种全新的排序算法呢?其实很多语言自带的排序算法就是结合了这种思想,请看下一篇笔记从零开始打造pdqsort实践 | 青训营笔记