数据结构慢慢啃(step 2)

212 阅读2分钟
  • 内部排序: 数据在内存中进行排序
  • 外部排序: 数据量过大, 排序的过程中会访问外存
  • 算法时间代价: 随着数据量增加, 增长的趋势相同, 并不是执行时间相同

常规排序算法

  • 冒泡排序: 遍历N次, 每次遍历都会把最大的移到最后. O(n^2)
    注: 5 - 2 = 3 (2, 5]中间有3个数字, 不包含2

  • 选择排序: 选择出最小的值放到前面去. O(n^2) [不稳定]

  • 插入排序: 插入的数据依次跟前面的数据进行比较. (类似扑克插入). O(n^2)

  • 归并排序: N个有序的链表, 进行合并(部分递归, 再合并[外排]) O(n * logn)
    递归: 子过程和父过程过程一致, 就是数据量不同

  • 快速排序: O(n * logn) [不稳定]

  1. 拿最后一个数据作为分界点, 拆分成2节, 2节不要求有序, O(n)
    升级版的拆分很为3节, < = > 3个部分. (荷兰国旗🇳🇱问题)
  2. 随机取出分界点, 目的为了防止出现数据分布不均匀(分布到一侧)导致出现 O(n^2) 注: 工程上常用的算法
  3. 递归处理
  • 堆排序: 完全二叉树, 从左到右添加子节点(脑补结构), 数组结构[不稳定]
  1. 根据插入顺序构建堆结构, 向上走 O(n)
  2. 首尾交换, 重新构建堆结构, 向下走 O(n * logn)
  • 桶排序: 不进行比较的排序.

稳定性: 每次排序, 针对于相同数据排序的位置是否发生了变化

Java中的实现

  • Java的Comparator 比较接口

通过返回的数值来决定谁排在前面
(o1, o2) -> {return xx}, 返回-1第一个就排在前面, 返回1第二个就排在前面, 返回0就无所谓
Arrays.sort, 为什么对象排序会使用Merge, 原生数据类型用Quick???