排序
各种排序比较:
时间复杂度:
n^2: 冒泡,插入,选择
n*log(n): 快排,归并,堆,shell,二叉树
n+k: 计数排序
稳定性:
稳定: 冒泡,插入,归并,基数,二叉树,计数
不稳定: 选择,快排,堆,shell
算法原理
归并(默认排序方式):
将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素
将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
重复步骤2,直到所有元素排序完毕
堆、二叉树:构建堆、二叉树就可以。
shell:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
适用场景
若n较小:可采用直接插入排序。
n较大:快排,归并,堆。
基本有序:直接插人、冒泡、快排(正序,倒着的话,可能n^2)。
手写快排:
手写归并排序:
Top K 问题:
最小堆: Queue<integer> queue = new PriorityQueue<>();
最大堆(重写Comparator):
Comparator<integer> cmp;
cmp = new Comparator<integer>(){
public int compare(Integer e1, Integer e2){
//里面想怎么写就怎么写
return e2-e1;
}
};</integer></integer></integer>
Queue<integer> queue = new PriorityQueue<integer>(cmp);</integer></integer>
查看26道真题和解析