首先分享一张堆排序的动态图,来自Wikipedia.
接下来继续回顾下各个排序算法的时间复杂度和空间复杂度的表格:
直接选择排序
原理:每轮比较之后都会记录最大值的下标,最后将该位置的元素与当前最后一个元素交换。
1 | //传入的n是数组长度 |
堆排序(大根堆)
思想:需要建立大根堆。首先初始化大根堆,然后将堆顶元素和最后一个元素交换;接着使用剩下的n-1个元素重新建立大根堆,然后又将堆顶元素与第n-1个元素交换,依次循环,直到剩下最后一个元素为止。
对的存储,使用数组,需要注意:
- 如果数组下标从0开始,则第i个节点的左孩子是
2 * i +1
,右孩子是2* i + 2
; - 如果数组下标从1开始,则第i个节点的左孩子是
2 * i
,右孩子是2* i +1
.
首先需要建立一个堆调整函数。
1 | //7.堆排序(大根堆)[数组下标从0开始],m表示起始下标,n表示终止数字的下标 |
1 | //堆排序 |
测试
下面简单的测试下堆排序:
1 |
|
输出结果:
1 2 3 4 5 6 7 8 9 10 21 22 121
Process returned 0 (0x0) execution time : 0.083 s
Press any key to continue.