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

112 阅读2分钟

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

经典排序算法

最快的排序算法

Python,Java ---TimSort

TimSort是一个自适应的、混合的、稳定的排序算法,融合了归并算法和二分插入排序算法的精髓。它充分利用了现实世界的待排序数据里面,有很多的子串是已经排好序的,不需要再重新排序,利用这个特性并且加上合适的合并规则可以更加高效的排序剩下的待排序序列。

和其他的归并排序算法一样,最坏情况下的时间复杂度是O(nlogn)的水平。但是在最坏的情况下,Timsort需要的临时存储空间只有n/2,在最好的情况下,需要的额外空间是常数级别的。

C++ ---introsort

Rust ---pdqsort

插入排序 Insertion Sort

image.png

最好情况(顺序排列)下的时间复杂度为O(n)

最坏情况(逆序排列)下的时间复杂度为O(n^2)

平均时间复杂度为O(n^2)

快速排序 Quick Sort

分治思想,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

最好情况(每一次选择的pivot都是中位数)下的时间复杂度为O(n*logn)

最坏情况(每一次选择的pivot都放在了最终位置)下的时间复杂度为O(n^2)

平均时间复杂度为O(n*logn)

堆排序 Heap Sort

基本思想:

1、将带排序的序列构造成一个大顶堆,根据大顶堆的性质,当前堆的根节点(堆顶)就是序列中最大的元素;

2、将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大顶堆;

3、重复步骤2,如此反复,从第一次构建大顶堆开始,每一次构建,我们都能获得一个序列的最大值,然后把它放到大顶堆的尾部。

最后,就得到一个有序的序列了。

最好情况下的时间复杂度为O(n*logn)

最坏情况下的时间复杂度为O(n*logn)

平均时间复杂度为O(n*logn)

pdqsort

  • 对于短序列,使用插入排序

  • 其他情况,使用快速排序来保证整体性能

  • 当快速排序表现不佳时,使用堆排序来保证最坏情况下的时间复杂度仍然为O(n*logn)

image.png

image.png