刷题中的排序算法的总结 | 豆包MarsCode AI刷题
排序算法
1)介绍:
- 稳定的排序:排序之后,相同值的不同元素的顺序还是未排序时的顺序
- 排序算法:

2)实现:
* 冒泡排序:
- 要点:两两比较,每次遍历结束,每次遍历的区域,最大的元素一定被送到最右边
- 优化:每次遍历结束时,找到下一次循环的合适的有边界




* 选择排序:
- 属于不稳定排序,最好/平均/最坏情况时间复杂度都为O(n^2),但是交换次数一般少于冒泡,所以一般比冒泡更快一点
- 要点:每轮选择最大/最小元素,放到对应位置(选择轮数:数组长度 - 1)

* 堆排序:
- 属于不稳定排序
- 要点:先建立大顶堆( heapify() ),然后从右往左交换元素到堆顶,再进行下潜操作重置大顶堆

- 回顾建堆方法heapify():对前一半数组元素进行下潜


* 插入排序:
- 要点:将数组分为已排序区和未排序区,每次从未排序区拿出一个元素,插入已排序区的合适位置


* 希尔排序:
- 性能很强
- 要点:通过间隙gap进行分组,不断让gap变小,重新排序,知道gap == 1


- 实现:初始gap = length / 2,每次 / 2

* 归并排序:<未完待续>
* 快速排序:<未完待续>
* 计数排序:<未完待续>
* 桶排序:
- 一、基础版:
- 要点:将不同区间的数据放进不同的桶,将桶中元素进行排序(这里是插入排序),最后将数据依次取出
- Ps:桶的数据结构选用ArrayList(动态数组),也就是图中的DynamicArray

- 问题:如果数据非常集中,会导致一些桶放数据过多而一些桶没有数据,影响性能
- 二、改进版:range是每个桶的容量

* 基数排序:
- 要点:按位数排序,先按个位来进行桶排序,然后取出按十位来桶排序,以此类推

* java中排序的选择:
- Java会根据size的不同选择不同的排序方法:
- JDK7 - 13:



3)排序 - 练习:
* 按照频率将数组升序排序:stream流排序比较器sorted()

- 代码:
- boxed():作用是将基本(原始)类型的stream转成了包装(boxed)类型的Stream
- ①用一个数组记录元素出现的次数:因为num范围是[-100 - 100],所以数组长度为201
- ②对int[] nums进行排序:先将他转换成stream流,再转换为包装类型,再实现排序比较器对不同情况的处理,最后转换回数组进行返回
