具体的算法流程可以参考 图解排序算法(三)之堆排序
和 视频 | 手撕九大经典排序算法,看我就够了
堆排序的基本思路
- 将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
- 堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
- 重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。
这里重点讨论下调整堆结构这个操作,这个结构是建立在大顶堆已经建立的基础上的,有递归和迭代两种方法。
递归方法:
public void heapify(int[] arr, int n, int i) {
int largest = i; // 将最大元素设置为堆顶元素
int l = 2 * i + 1; // left = 2*i + 1
int r = 2 * i + 2; // right = 2*i + 2
// 如果 left 比 root 大的话
if (l < n && arr[l]