详解经典排序算法
TODO
数据结构与算法
01. 为什么要学习数据结构和算法
例子:抖音直播排行榜功能
02.经典排序算法
插入排序 | 快速排序 | 堆排序 | Benchmark
插入排序 Insertion Sort
将元素不断插入已经排序好的 array 中
-
起始只有一个元素5,其本身是一个有序序列
-
后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素
Insertion Sort Time complexity
Best | Avg | Worst |
---|---|---|
O(n) | O(n^2) | O(n^2) |
缺点:
- 平均和最坏的情况的时间复杂度高达O(n^2)
优点:
- 最好情况的时间复杂度为O(n)
Quick Sort 快速排序
分治思想,不断分割序列直到序列整体有序
-
选定一个 pivot (轴点)
-
使用 pivot 分割序列,分成元素比 pivot大和元素比 pivot小两个序列
Quick Sort Time complexity
Best | Avg | Worst |
---|---|---|
O(n*logn) | O(n*logn) | O(n^2) |
Best:每次选择的轴点恰好是中位数,每次分割都能分成两个几乎相等大小的元素。
Worst:每次只将一个元素放到最终的位置。(1 2 3 4 5 6),但每次只解决一个,其他还是老样子。
缺点:
- 最坏情况的时间复杂度高达O(n^2)
优点:
- 平均情况的时间复杂度为O(n*logn)
Heap Sort 堆排序
利用堆的性质形成的排序算法
-
构造一个大顶堆
-
将根节点(最大元素) 交换到最后一个位置,调整整个堆,如此反复
Heap Sort Time complexity
Best | Avg | Worst |
---|---|---|
O(n*logn) | O(n*logn) | O(n*logn) |
缺点:
- 最好情况的时间复杂度高达O(n*logn)
优点:
- 最坏情况的时间复杂度高达O(n*logn)
经典算法理论印象
Best | Avg | Worst | |
---|---|---|---|
Insertion Sort | O(n) | O(n^2) | O(n^2) |
Quick Sort | O(n*logn) | O(n*logn) | O(n^2) |
Heap Sort | O(n*logn) | O(n*logn) | O(n*logn) |
-
插入排序平均和最坏情况的时间复杂度都是O(n^2),性能不好
-
快速排序整体性能处于中间层次
-
堆排序性能稳定,“众生平等”
实际场景 benchmark
Best | Avg | Worst | |
---|---|---|---|
Insertion Sort | O(n) | O(n^2) | O(n^2) |
Quick Sort | O(n*logn) | O(n*logn) | O(n^2) |
Heap Sort | O(n*logn) | O(n*logn) | O(n*logn) |
根据序列元素排列情况划分
-
完全随机的情况 (random)
-
有序/逆序的情况 (sorted/reverse)
-
元素重复度较高的情况 (mod8)
在此基础上,还需要根据序列长度的划分(16/128/1024)