这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
本次堂课程主要是介绍了最常用的算法--排序算法。Go语言在1.18及以前版本使用的是introsort排序算法,而go1.19将采用更优的排序算法--pdqsort,pdqsort是Pattern-defeating quicksort的缩写,是一种新型的排序算法,将随机快速排序的快速平均情况与堆排序的最坏情况快速组合在一起,同时在具有特定模式的输入上实现了线性时间。 pdqsort是David Mussers introsort的扩展和改进。使得排序总体效率高于原先算法,同时在某些常见场景更是可以大幅度提升。
排序
插入排序
- 从待排序队列中依次取出,放入我们已排序队列中
- 每次从待排序队列中取一个值,放到已排序好的队列,再次保持有序,重复这样的操作,直到把待排序队列中的值全部取完,,直到完全有序
时间复杂度与空间复杂度
时间复杂度:
- 最优 O(n)
- 最坏时间复杂度为 O(n^2)
- 平均时间复杂度为 O(n^2)
空间复杂度:
- O(1)
排序稳定度
- 稳定
使用场景
- 当问题规模很小的时候(n很小),则 n^2 不会很大
- 待排序队列越有序,则直接插入排序越优解
快速排序
- (越乱越有序)从右向左找比基准值小的,向左放,再从左向右找比基准值大的,向右放,重复此过程 直到完全有序
时间复杂度与空间复杂度
时间复杂度:
-
平均时间复杂: O(nlogn)
-
最坏时间复杂度:O(n^2) 快速排序序列如果已经完全有序的话,则再执行快速排序则会变成选择排序 时间复杂度变成 O(n^2)
空间复杂度:
- O(logn)
排序稳定度
- 不稳定
堆排序
- 将一维数组臆想成一个完全二叉树,再将其调整为大顶堆,再将根节点和尾节点进行交换,再次进行调整,这样循环往复,直至将其调整为完全有序
时间复杂度与空间复杂度
时间复杂度:
- 时间复杂度 : O(nlogn)
空间复杂度:
- 空间复杂度 : O(1)
排序稳定度
- 不稳定