《数据结构和算法》 | 青训营笔记

94 阅读1分钟

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

1.排序算法

Go中现在一般默认使用的是pdqsort

经典排序算法:

插入排序性能不好,快排介于中间,堆排性能稳定,各自有各自的适用情况。 插排适用于短序列,快排适用于随机序列,堆排一直较快。  

实现pdqsort:

是一种不稳定的排序混合算法,已经有较多的应用。主要分为以下三种情况:

1.短序列(<=24)适用插入排序
2.使用快速排序,但排序时需判断pivot的位置是否与两端距离过近(<=lenght/8),当这种情况超过limit时,切换到堆排
3.使用堆排

我们知道快排中可以通过选择pivot来优化,短序列(<=8)选择固定元素,中序列(<=50)采样三个元素,长序列(>50)采样九个元素。通过采样我们可以判断,如果采样全逆序则翻转,如果采样全有序则使用插排(有限制次数)

若重复元素过多,则当本次的pivot与上次相同,把重复元素排在一起,如果pivot的表现总是不佳,则可先打乱再重排