刷题中的排序算法的总结 | 豆包MarsCode AI刷题

126 阅读2分钟

排序算法

1)介绍:

  • 稳定的排序:排序之后,相同值的不同元素的顺序还是未排序时的顺序
  • 排序算法:

image-20241107193549249

2)实现

* 冒泡排序:

  • 要点:两两比较,每次遍历结束,每次遍历的区域,最大的元素一定被送到最右边
  • 优化:每次遍历结束时,找到下一次循环的合适的有边界

image-20241107193655605

image-20241107193715738

image-20241107193931462

  • 代码

image-20241107194609841

* 选择排序:

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

image-20241107195245922

* 堆排序:

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

image-20241108181128802

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

image-20241108181243621

  • 回顾下潜方法down():非递归

image-20241108180951578

* 插入排序:

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

image-20241108182216493

  • 非递归版:外面套一层循环( low从1到数组尾)

image-20241108182250770

* 希尔排序:

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

image-20241108182807825

  • 例:gap = 4 -> 2 -> 1

image-20241108183027948

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

image-20241108183338187

* 归并排序:<未完待续>

* 快速排序:<未完待续>

* 计数排序:<未完待续>

* 桶排序:

  • 一、基础版:
  • 要点:将不同区间的数据放进不同的桶,将桶中元素进行排序(这里是插入排序),最后将数据依次取出
  • Ps:桶的数据结构选用ArrayList(动态数组),也就是图中的DynamicArray

image-20241112163741710

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

image-20241112164618652

* 基数排序:

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

image-20241112165718131

* java中排序的选择:

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

image-20241108185903115

  • JDK14 - 20:

image-20241108190128233

  • 补充:

image-20241108190217801

3)排序 - 练习

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

  • 题目:

image-20241108193526018

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

image-20241108193557340