这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
1.排序算法
Go中现在一般默认使用的是pdqsort
经典排序算法:
插入排序性能不好,快排介于中间,堆排性能稳定,各自有各自的适用情况。 插排适用于短序列,快排适用于随机序列,堆排一直较快。
实现pdqsort:
是一种不稳定的排序混合算法,已经有较多的应用。主要分为以下三种情况:
1.短序列(<=24)适用插入排序
2.使用快速排序,但排序时需判断pivot的位置是否与两端距离过近(<=lenght/8),当这种情况超过limit时,切换到堆排
3.使用堆排
我们知道快排中可以通过选择pivot来优化,短序列(<=8)选择固定元素,中序列(<=50)采样三个元素,长序列(>50)采样九个元素。通过采样我们可以判断,如果采样全逆序则翻转,如果采样全有序则使用插排(有限制次数)
若重复元素过多,则当本次的pivot与上次相同,把重复元素排在一起,如果pivot的表现总是不佳,则可先打乱再重排