以小顶堆实现升序排序
思路
- 堆化
- 创建辅助空间,并将原数组拷贝给辅助空间
- 在辅助空间上,将根节点元素与数组最后一个元素位置交换,在原数组上记录此时的最后一个元素。
- 在辅助空间上调整数组,但规模(n)减1。
- 如此循环直到n=3
// 升序堆排序
public static void minHeapUpSort(int[] arr, int i, int n) {
makeMinHeap(arr);
int[] helper = new int[n];
upSort(arr, helper, i, n);
}
// 借助辅助空间,排序。
public static void upSort(int[] arr, int[] helper, int i, int n) {
copy(arr, helper);
int cur = 1;
while (n > 3) {
// 把最后一个节点调到i
helper[i] = helper[n - 1];
// 调整n-1个,每次都将最小的元素放在i处
minHeapFixDown(helper, i, n - 1);
// 记录i节点
arr[cur] = helper[i];
cur++;
n--;
}
}