红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec28 Sorting I

Lec28 Sorting I

排序的定义

排序关系:小于号<对于a,b,c有以下特性

  • 只有\(a<b, a=b,a>b\)三者其一为真
  • \(a<b \and b<c\),则\(a<c\)

排序实际上是序列元素的一个排列,使得其中的键按照相对于给定排序关系的非降序排列

如:string的长度,符合上述两个特性

Java中通常使用compareTo来定义排序关系

取决于正在处理的对象类型,或者自己选择不同排序方式,可以得到不同的排序

comparator

逆序对

逆序对是一对元素,这对元素相对于当前操作是无序的

如0 1 1 2 3 4 8 6 9 5 7,对于<操作

8-6 6-5 8-7 6-5 9-5 9-7都是无序的,称为逆序对

因此另一种排序的目标可以描述为:

  • 给予一个存在z个逆序对的元素序列
  • 执行一系列操作使得逆序对的数量减少为0

选择排序

  • 在数组未排序部分找到最小元素
  • 将它移动到数组已排序部分的末尾
  • 继续对剩下未排序元素使用选择排序

时间复杂度:\(O(n^2)\)

空间复杂度:\(O(1)\)

堆排序

为了更快的获得最小元素,我们维护一个堆(大根堆)辅助寻找

  • 将所有元素放入一个大根堆,创建一个输入数组

    堆排序1
  • 循环N次(N为元素个数)

    • 从大根堆中删除最大元素
    • 将删除元素放在输出数组未使用部分的末尾
    堆排序2

时间复杂度:\(O(n\log n)\)

空间复杂度:\(O(n)\)

优化

可以将堆存在原始输入空间中,避免使用两份空间,且在交换过程中产生多余的空位

  • 将输入转化成堆(最大堆)
    • 上浮节点
    • 确保当前节点为根的树是一个堆
  • 循环N次,从大根堆中删除最大元素,并移动到堆的最后一项(即与之交换)

这样可以做到\(O(1)\)的额外内存

时间复杂度:\(O(n\log n)\)

空间复杂度:\(O(1)\)