文章目录
比较排序
------------基础排序----------
冒泡排序
谁大谁上,每一轮都把最大的顶到天花板,效率太低O(n^2),掌握swap。
选择排序
效率较低,但经常用它内部的循环方式来找最大值和最小值,O(n^2)。
插入排序
虽然平均效率低,但在序列基本有序时,它很快,所以也有其使用范围。Arrays工具类在1.7做了较大改动。
希尔排序
希尔排序(缩小增量排序),是插入排序的改良,对空间思维训练有帮助。
-------------分治法------------
1.子问题拆分
2.递归求解子问题
3.合并子问题的解
快速排序
快速排序是软件工业中最常见的常规排序法,其双向指针扫描和分区算法是核心,往往用于解决类似问题,特别地partition算法用来划分不同性质的元素,partition->selectK也用于著名的topk问题。
时间复杂度O(nlgn),但是如果主元不是中位数的话,特别地如果每次主元都在数组区间的一侧,复杂度将退化为n^2。
工业优化:三点取中法,绝对中值法,小数据量用插入排序。
快排重视子问题拆分。
归并排序
空间换时间,归并重视子问题的解的合并。
堆排序
用到了二叉堆数据结构,是继续掌握树结构的起手式。
总结: 以上七种排序都是基于比较的排序,在元素随机顺序情况下它们中最好的也只是nlgn。快排,归并,堆排序都是nlgn的复杂度,其中快排表现最好,是原址的不用开辟辅助空间;堆排序也是原地址的,但是常数因子较大,不具备优势。
下面三个是非比较排序,在特定情况下会比基于比较的排序快。
非比较排序
计数排序
可以说是最快的,用它来解决问题时必须注意如果序列中的值分布非常稀疏,并且最大值很大,空间将会浪费很多。
所以计数排序的适用范围是:序列中的值比较集中,已知边界,且边界较小。
桶排序
先分桶,再用其他排序方法对桶内元素进行排序,最后按桶编号依次出桶。
用它解决问题必须注意序列的值是否均匀分布在桶中。如果不均匀,那么个别桶中的元素可能会远多于其他桶,桶内排序用比较排序,极端情况下,全部元素在一个桶内,复杂度退化为nlgn。
基数排序
数值型排序里又快又稳的排序,无论元素分布如何,只开辟固定的辅助空间(10个桶)。
对比桶排序,基数排序每次需要的桶的数量并不多。而且基数排序几乎不需要任何 “比较”操作,而桶排序桶内多个数据每次必须进行基于比较操作的排序。
因此,在实际应用中,基数排序的应用范围更加广泛。