Go语言排序算法|青训营笔记

113 阅读2分钟

Go语言排序算法

插入排序:将后面的元素不断插入已经排序好的序列中

性能表现:最好情况的时间复杂度O(n) 平均时间复杂度O(n^2) 最坏的情况下时间复杂度是O(n^2)

缺点:平均和最坏情况的时间复杂度高达O(n^2)

优点:最好情况的时间复杂度是O(n)

快速排序:基于分治思想,不断分割序列直到序列整体有序;使用一个轴点(pivot);使用pivot分割序列,分成元素比pivot大和元素比pivot小两个序列

有点像二分查找法的方法?

性能表现:最好情况的时间复杂度,选择的轴点恰好是中位数O(nlogn) 平均时间复杂度O(nlogn) 最坏的情况下时间复杂度O(n^2)

缺点:最坏情况下的时间复杂度高达O(n^2)

优点:平均时间复杂度优于插入排序

堆排序:利用堆的性质形成的排序算法;构造一个大顶堆;将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复

性能表现:最好情况下的时间复杂度是O(nlogn),平均时间复杂度是O(nlogn),最坏情况下的时间复杂度是O(n*logn)

缺点:最好情况下的时间复杂度高达O(n*logn)

优点:最坏情况下也达不到O(n^2) 稳定性高

插入排序的平均和最坏情况下的时间复杂度都是O(n^2)性能不好;快速排序整体性能处于中间层次;堆排序性能稳定“众生平等”;

根据序列元素的排列情况划分:完全随机的情况(random);有序/逆序的情况(sorted/reverse);元素重复度较高的情况(mod8);在此基础上,还需要根据序列长度的划分(16/128/1024)

插入排序在短序列中速度最快;快速排序在其他情况中速度最快;堆排序速度与最快算法差距不大

当序列排序本身就是有序的情况下:短序列中插入排序的速度最快;中序列中依然是插入排序的速度最快,但堆排序和它的差距不大;长序列情况下和中序列差不多;总结:插入排序在序列已经有序的情况下速度是最快的

所有短序列和元素有序的情况下,插入排序性能最好;在大部分情况下,快速排序有较好的综合性能;几乎在任何情况下,堆排序的表现都比较稳定