魔术桌
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • Algorithm - 排序 - 堆排序

文章摘要: 堆排序是一种基于比较的排序算法,利用堆这种数据结构进行排序。

简介

简要说明

  • 堆排序是一种基于比较的排序算法,利用堆这种数据结构进行排序。
  • 堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

主要功能

  • 对一组数据进行排序,使得数据按照升序或降序排列。
  • 通过构建最大堆或最小堆,将最大(或最小)元素移动到数组的起始位置,然后与最后一个元素交换,逐步缩小堆的大小,最终得到排序数组。

注意事项

  • 堆排序不是稳定的排序算法,因为它会改变相等元素的相对顺序。
  • 在实现堆排序时,需要注意维护堆的性质。

适用场景

  • 适用于数据量较大的情况。
  • 适用于需要非稳定排序的场景。
  • 适用于对时间复杂度有较高要求的场景。

时间复杂度

  • 最坏情况:O(n log n),因为每次调整堆的时间复杂度是O(log n),需要调整n次。
  • 平均情况:O(n log n)。
  • 最好情况:O(n log n)。

空间复杂度

  • O(1),堆排序是在原地进行的,不需要额外的存储空间。

Java 8

public class HeapSortExample {

    public static void main(String[] args) {
        int[] array = {12, 11, 13, 5, 6, 7};
        heapSort(array); // 对数组进行堆排序
        printArray(array); // 打印排序后的数组
    }

    // 堆排序方法
    public static void heapSort(int[] arr) {
        int n = arr.length;

        // 构建最大堆
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }

        // 一个个从堆顶取出元素
        for (int i = n - 1; i >= 0; i--) {
            // 当前根元素与最后一个元素交换
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // 调整剩余堆
            heapify(arr, i, 0);
        }
    }

    // 调整堆的方法
    public static void heapify(int[] arr, int n, int i) {
        int largest = i; // 初始化最大元素索引为根节点
        int left = 2 * i + 1; // 左子节点
        int right = 2 * i + 2; // 右子节点

        // 如果左子节点大于根节点
        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }

        // 如果右子节点比最大元素还大
        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }

        // 如果最大元素不是根节点
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;

            // 递归地调整受影响的子堆
            heapify(arr, n, largest);
        }
    }

    // 打印数组方法
    public static void printArray(int[] arr) {
        for (int value : arr) {
            System.out.print(value + " "); // 打印数组元素,后面跟一个空格
        }
        System.out.println(); // 打印完数组后换行
    }
}

注释

在这个Java案例中,heapSort方法实现了堆排序算法。首先通过heapify方法构建最大堆,然后将堆顶元素(最大值)与最后一个元素交换,并重新调整剩余元素构成的堆,重复这个过程直到堆的大小为1。printArray方法用于打印排序后的数组。

更新时间: 2025/10/3 17:56