[Go 1.19 排序算法实践 | 青训营笔记 ]

108 阅读2分钟

数据结构与算法

一、详解经典排序算法

数据结构和算法几乎存在于程序开发的所有地方
Go 1.19的排序算法 如何设计?有何区别?快速排序?

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

image.png 缺点:平均和最坏情况时间复杂度较高,n^2
优点:最好情况时间复杂度为n

1.2 快速排序:分治思想,分成比轴点大的序列和小的序列

image.png 缺点:最坏情况
优点:最优情况和平均情况

1.3 堆排序:利用堆的性质

image.png 时间复杂度非常稳定

1.4 实际场景测试:

image.png

  • random:插入排序在短序列速度最快,快速排序在其他情况中速度最快,堆排序于最快算法差距不大
  • sorted/reverse:插入排序在有序情况下性能最好
  • mod8

结论:①所有短序列和元素有序情况下,插入排序性能最好(单车)
②大部分情况下,快速排序有较好的综合性能(汽车)
③堆排序表现比较稳定(地铁)

二、从零开始打造 pdqsort

2.1 pdqsort简介

pdqsort:不稳定的混合排序算法 image.png 短序列长度:泛型版本选定为24
如何得知快排表现不佳?何时切换到堆排序?

2.2 pdqsort—version1

image.png image.png 如何让pdqsort速度更快? ——>改进choose pivot

2.3 pdqsort—version2

关于pivot的选择

  • 使用首个元素(最简单方案) 实现简单,但效果不好
  • 遍历数组,找真正中位数 遍历代价很大,性能不好

优化-Pivot的选择

  1. 中序列(<=50),采样三个元素,median of three
  2. 长序列(>50),采样九个元素,median of medians
  3. 插入排序使用有限制次数的插入排序

image.png

2.4 version1——version2

  • 升级privot选择策略(近中位数)
  • 优化reverse场景(颠倒序列)
  • 优化sorted场景(有限制的插入排序)

2.5 final version

  • 优化-重复很多的情况
  • 优化-选择privot选择策略表现不佳时,随机交换元素

高性能排序算法如何设计?
根据不同情况选择不同策略,取长补短

生产情况使用的排序算法和课本排序算法有什么区别?
理论算法注重理论性能,生产环境算法需要面向不同的实践场景,更加注重实践性能