zhangbuda7788 blog

排序算法

十大排序算法

总结

排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性

冒泡 O(n^2) O(n) O(n^2) O(1) 稳定

选择 O(n^2) O(n^2) O(n^2) O(1) 不稳定

插入 O(n^2) O(n) O(n^2) O(1) 稳定

希尔 O(nlog(n)) O(nlog^2(n)) O(nlog^2(n)) O(1) 不稳定

归并 O(nlog(n)) O(nlog(n)) O(nlog(n)) O(n) 稳定

快速 O(nlog(n)) O(nlog(n)) O(n^2) O(log(n)) 不稳定

堆排序 O(nlog(n)) O(nlog(n)) O(nlog(n)) O(1) 不稳定

计数 O(n + k) O(n + k) O(n + k) O(k) 稳定

桶 O(n + k) O(n + k) O(n^2) O(n + k) 稳定

基数 O(n * k) O(n * k) O(n * k) O(n + k) 稳定


这十大排序其实,硬记是不大好的,应该巧记,以及熟悉它的思维,我想这才是重点,因为很多高级语言都已经可以直接调用封装的排序库


一点认识

计数排序的局限性很高,范围太大的排序(离散)、非整数的排序不是不符合要求的

本质是通过计数 比如 2 2 5 1 3 1 4 1 4 5

经过统计后 1 1 1 2 2 3 4 4 5 5

这样就是排序后的结果,只是 output[count[arr[i] - 1]] = arr[i]; count[arr[i]]–; 采用前缀和 的方式处理 比如 1 1 1 (待排序) ==> 1 1 (待排序)

最开始 采用 count 统计值 x 的个数 y , 储存方式 count[x] = y;  
把所有的 x1, x2, x3,...xn 储存,可以按照 min --> max 进行前缀求和 相同的元素(从右往左 依次削掉,就可以把前缀元素全部移入output)  

code

我的代码仓库(ten sorts code) 支持泛化排序, 不过特定的比如基数排序支持 char、int

动态排序 code

堆排序

快速排序


end

有几块要注意的,一个是由冒泡到选择。由选择到插入。 插入到希尔。 引入了 gap 归并 引入分治 堆、计数、基数、桶 引入分治 + 前缀和。注意:桶 是 分治再用线程的排序对桶内元素排序,所以稳定性就有保证


#c/c++