各基础排序算法小结 | 青训营笔记

146 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 15 天,今天对数据结构与算法中,比较经典的排序算法,并对go语言1.19中默认使用的pdqsort设计原理进行简单的学习,在这打算先对一些基础排序算法中,排序的优势进行一定小结

各语言默认的排序方法

C++:introsort

Python:timsort

rust:pdqsort

go:introsort(1.18及之前),pdqsort(1.19)

常见的基础排序方法

因为各排序算法在不同情况下的效率不同,语言的默认排序算法往往都采用了混合的排序算法。所以在研究go语言pdqsort的设计之前,可以先把基础的排序算法的实现,以及在不同数据量场景下的优缺点进行一些总结

插入排序

原理: 将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

时间复杂度:

最优平均最差
O(n)O(n)O(n2)O(n^2)O(n2)O(n^2)

快速排序

原理: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。

时间复杂度:

最优平均最差
O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(n2)O(n^2)

堆排序

原理: 首先将待排序的数组构造成一个大根堆,此时整个数组的最大值就是堆结构的顶端;将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1;将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组。

时间复杂度:

最优平均最差
O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)

各数据长度下排序算法的效率

短序列(长度16):最快插入排序

中序列(长度128):最快快速排序(与堆排序差距不大)

长序列(长度1024):最快快速排序

小结

在基础排序算法中,各个算法在不同情况下(随机、有序、重复度不同、长度不同),展现出的效率并不相同,要想实现一个效率更高的排序算法,就需要结合各个排序算法在不同情况下的优势。