数据结构与算法|青训营笔记

183 阅读2分钟

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

为什么学

  • 例子-抖音直播排行榜功能 image.png

image.png

  • 什么是最快的排序算法

image.png

image.png

image.png

经典排序算法

插入排序

image.png

  • 将后面的元素不断插入前面已排好序的array中
  • 时间复杂度
    • best O(n) 已经有序
    • avg O(n^2)
    • worst O(n^2) 逆序
  • 缺点
    • avg worst 慢
  • 优点 best O(n)

快速排序

  • 分治思想,不断分割序列直到序列整体有序
  • 步骤
    • 选定一个pivot
    • 使用pivot分割序列,分成元素小于与大于pivot的两个序列
  • 时间复杂度
    • best O(n*logn) 每次pivot恰好为中位数
    • avg O(n*logn)
    • worst O(n^2) 每次只让一个元素有序
  • 缺点
    • worst 慢
  • 优点 best avg O(nlogn)

堆排序

  • 时间复杂度
    • best O(n*logn)
    • avg O(n*logn)
    • worst O(n*logn)
  • 缺点
    • best O(n*logn)

理论印象

image.png

实际场景benchmark

image.png

image.png

image.png

image.png

image.png

pdqsort(pattern-defeating-quicksort)

排序算法-根据场景不同选择最优

image.png

  • 一种不稳定的混合排序算法。

image.png

version1

  • 短序列采用插入排序
  • 其他情况用快速排序保证整体性能
  • 当快速排序表现不佳时,使用堆排序来保证最坏情况下时间复杂度仍然为O(nlogn)

image.png

image.png

image.png

image.png

version2

image.png

  • 根据序列长度的不同,来决定选择策略

  • 优化-Pivot的选择

    • 短序列<=8,选择固定元素
    • 中序列<=50, 采样三个元素 median of three
    • 长序列>50, 采样九个元素,median of meidans
  • pivot的采样方式使得有探知序列当前状态的能力

image.png

image.png 可能有序并非真正有序,如果排列了x次,发现还未有序,就不再继续使用插入排序

image.png

version3

image.png

  • 如何优化重复元素很多的情况?

image.png

image.png

partition equal:把相同的元素都排到一起

image.png

image.png