这是我参与 [第三届青训营 -后端场]笔记创作活动的第5篇笔记
为什么要学习数据结构与算法
程序开发所有地方都存在'
什么是最快的排序算法?
单线程: (看场景)
Python-timsort
C++-introsort
排序算法
Go 排序算法如何设计?
生产环境中使用的排序算法和课本上的排序算法,区别?
GO语言排序算法是快排吗?
插入排序(后面的无序序列,插入到前面的有序序列)
n
n*n
n*n
快速排序
n*logn
n*logn
n*n
堆排序
利用堆(数据结构)的性质
n*logn(all)
Benchmark
序列大小
序列无序
16:插排
128:堆排?❌ 快排!(堆排差距不大)
1024: 快排? √ (其一次遍历可以完成多个元素)(提前打好括号,没想到对啦)(堆排序,其实差别不大)
序列本身有序
短: 插排
中:插排
长:插排
插排有序,最快.(所有短序列,和有序序列,插入排序性能最好)
类比?
插入排序 > 单车(全都是自己做的)
快速排序 > 汽车
堆排序 > 地铁
能不能说,长距离用汽车/地铁,之后再用单车?
从0开始实现pdqsort
pattern-defeating-quicksort
不稳定的混合排序算法
- 短序列具体长度是多少?
12~32(场景不同) 选定:24
-
如何得知快速排序表现不佳,何时切换到堆排序?
快速排序的pivot的位置,离两端很近(小于 len/8)[每次交换的元素少..],这样几次(limit)后换堆排序.limit:元素越多,limit越大
-
重复度高,怎么办?
- fallback时机
- pivot选择策略
- 针对不同pattern优化
\