基本算法 | 青训营笔记

38 阅读2分钟

详解经典排序算法

TODO

数据结构与算法

01. 为什么要学习数据结构和算法

例子:抖音直播排行榜功能

02.经典排序算法

插入排序 | 快速排序 | 堆排序 | Benchmark

插入排序 Insertion Sort

algo-insert-sort-case.png

将元素不断插入已经排序好的 array 中

  • 起始只有一个元素5,其本身是一个有序序列

  • 后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素

Insertion Sort Time complexity

BestAvgWorst
O(n)O(n^2)O(n^2)

缺点

  • 平均和最坏的情况的时间复杂度高达O(n^2)

优点:

  • 最好情况的时间复杂度为O(n)

Quick Sort 快速排序

algo-quick-sort-case.gif

分治思想,不断分割序列直到序列整体有序

  • 选定一个 pivot (轴点)

  • 使用 pivot 分割序列,分成元素比 pivot大和元素比 pivot小两个序列

Quick Sort Time complexity

BestAvgWorst
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 堆排序

algo-heap-sort-case.gif

利用堆的性质形成的排序算法

  • 构造一个大顶堆

  • 将根节点(最大元素) 交换到最后一个位置,调整整个堆,如此反复

Heap Sort Time complexity

BestAvgWorst
O(n*logn)O(n*logn)O(n*logn)

缺点:

  • 最好情况的时间复杂度高达O(n*logn)

优点:

  • 最坏情况的时间复杂度高达O(n*logn)

经典算法理论印象

BestAvgWorst
Insertion SortO(n)O(n^2)O(n^2)
Quick SortO(n*logn)O(n*logn)O(n^2)
Heap SortO(n*logn)O(n*logn)O(n*logn)
  • 插入排序平均和最坏情况的时间复杂度都是O(n^2),性能不好

  • 快速排序整体性能处于中间层次

  • 堆排序性能稳定,“众生平等”

实际场景 benchmark

BestAvgWorst
Insertion SortO(n)O(n^2)O(n^2)
Quick SortO(n*logn)O(n*logn)O(n^2)
Heap SortO(n*logn)O(n*logn)O(n*logn)

根据序列元素排列情况划分

  • 完全随机的情况 (random)

  • 有序/逆序的情况 (sorted/reverse)

  • 元素重复度较高的情况 (mod8)

在此基础上,还需要根据序列长度的划分(16/128/1024)


03.