Lec28 Sorting I
排序的定义
排序关系:小于号<对于a,b,c有以下特性
- 只有\(a<b, a=b,a>b\)三者其一为真
- 若\(a<b \and b<c\),则\(a<c\)
排序实际上是序列元素的一个排列,使得其中的键按照相对于给定排序关系的非降序排列
如:string的长度,符合上述两个特性
Java中通常使用compareTo来定义排序关系
取决于正在处理的对象类型,或者自己选择不同排序方式,可以得到不同的排序
逆序对
逆序对是一对元素,这对元素相对于当前操作是无序的
如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)\)
堆排序
为了更快的获得最小元素,我们维护一个堆(大根堆)辅助寻找
将所有元素放入一个大根堆,创建一个输入数组
循环N次(N为元素个数)
- 从大根堆中删除最大元素
- 将删除元素放在输出数组未使用部分的末尾
时间复杂度:\(O(n\log n)\)
空间复杂度:\(O(n)\)
优化
可以将堆存在原始输入空间中,避免使用两份空间,且在交换过程中产生多余的空位
- 将输入转化成堆(最大堆)
- 上浮节点
- 确保当前节点为根的树是一个堆
- 循环N次,从大根堆中删除最大元素,并移动到堆的最后一项(即与之交换)
这样可以做到\(O(1)\)的额外内存
时间复杂度:\(O(n\log n)\)
空间复杂度:\(O(1)\)