编程语言
首页 > 编程语言> > 常见的排序算法:堆排序

常见的排序算法:堆排序

作者:互联网

文章目录

1. 原理

请添加图片描述

2. 代码实现

public void heapSort(int[] arr) {
    // 将数组调整为一个"大根堆"
    // (arr.length - 2) / 2 为堆的最后一个叶子节点的父节点
    for (int i = (arr.length - 2) / 2; i >= 0; i--) {
        adjustDown(arr, i, arr.length);
    }
    // 开始调整
    // 每次调整由于无需区间交换后的最后一个以及有序了,所以最后一个元素不需要调整
    int end = arr.length - 1;
    while (end > 0) {
        int tmp = arr[end];
        arr[end] = arr[0];
        arr[0] = tmp;
        adjustDown(arr, 0, end);
        end--;
    }
}

/**
* @param arr 待调整数组
* @param end 标记调整区间的长度
*/
public void adjustDown(int[] arr, int parent, int end) {
    int child = 2 * parent + 1;
    while (child < end) {
        // 保证 child 下标指向的元素是两个子节点中最大的
        if (child + 1 < end && arr[child] < arr[child + 1]) {
            child++;
        }
        if (arr[parent] < arr[child]) {
            int tmp = arr[parent];
            arr[parent] = arr[child];
            arr[child] = tmp;
            parent = child;
            child = 2 * parent + 1;
        } else {
            // 由于是从最后一个叶子节点开始调整,那么 arr[parent] > arr[child] 时
            // 以 arr[parent] 为根节点的这棵树以及是"大根堆"了,不需要继续向下调整了
            break;
        }
    }
}

3. 复杂度

时间复杂度空间复杂度
O(n*logn)O(1)
数据不敏感数据不敏感

标签:大根堆,arr,end,parent,堆排序,算法,child,排序,节点
来源: https://blog.csdn.net/qq_52574924/article/details/119332680