当前位置: 首页 > article >正文

数据结构-堆排序笔记

1  思路

总体思路

首先我们会拿到一个无序的数组,我们需要先对其构建成一个堆。下面我们示例将会构建成大顶堆。然后我们对顶堆的元素进行位置之间的交换。交换的同时继续对其维护大顶堆的性质,直至大顶堆只剩下一个元素。

具体思路

首先我们先将一个无序数据将其构建成一个大顶堆。我们将数据模拟成一个大顶堆,并不是真实地去构建。其实就是按照堆中元素下标对应关系来实现。

元素之间下标关系:

下标为  i  的节点的父节点下标为  (i + 1) / 2

下标为  i  的节点的左孩子的下标为  i   *  2  +  1

下标为  i  的节点的右孩子的下标为  i   *  2  +  2

然后我们来调整这个数组让他符合大顶堆的规则,就是调整对应的下标,交换数组内的元素

然后我们把整个数组看成未排序和已排序两个部分,也就是未排序的数组的最大的元素和最小的元素的位置。在交换之后最大的元素已经在数组最后面,此时最后面就是有序的数组。然后我们在维护这个顶堆的规则。

2  具体实现

import java.util.*;

public class Main {

    // 主函数入口
    public static void main(String[] args) {
        // 初始化一个整型数组
        int arr[] = new int[]{2, 1, 8, 122, 3, 6, 10, 11};
        // 调用sort方法对数组进行排序
        sort(arr);

        // 遍历排序后的数组并打印每个元素
        for (int i : arr) {
            System.out.print("" + i + " ");
        }
    }

    // 排序方法,使用堆排序算法
    static void sort(int arr[]) {
        int n = arr.length; // 获取数组长度
        // 从最后一个非叶子节点开始,向下调整每个节点,构建最大堆
        for (int i = n / 2 - 1; i >= 0; i--) {
            heap_sort(arr, n, i);
        }

        // 从最后一个元素开始,将其与堆顶元素交换,然后对堆进行调整
        for (int i = n - 1; i > 0; i--) {
            swap(i, 0, arr); // 将当前元素与堆顶元素交换
            heap_sort(arr, i, 0); // 对堆进行调整
        }
    }

    // 堆排序的辅助方法,用于向下调整堆
    private static void heap_sort(int[] arr, int n, int i) {
        int largest = i; // 初始化最大元素索引为当前节点
        int lson = i * 2 + 1; // 左子节点索引
        int rson = i * 2 + 2; // 右子节点索引

        // 如果左子节点存在且值大于当前最大元素,则更新最大元素索引
        if (lson < n && arr[lson] > arr[largest]) {
            largest = lson;
        }
        // 如果右子节点存在且值大于当前最大元素,则更新最大元素索引
        if (rson < n && arr[rson] > arr[largest]) {
            largest = rson;
        }

        // 如果最大元素不是当前节点,则交换它们,并递归地调整堆
        if (largest != i) {
            swap(largest, i, arr);
            heap_sort(arr, n, largest);
        }
    }

    // 交换数组中的两个元素
    private static void swap(int maxIndex, int minIndex, int arr[]) {
        int temp = arr[maxIndex]; // 临时变量用于交换
        arr[maxIndex] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

3  总结

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

http://www.kler.cn/a/403213.html

相关文章:

  • 【Unity How】Unity中如何实现物体的匀速往返移动
  • Java LinkedList 详解
  • Swift从0开始学习 对象和类 day3
  • Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段
  • 音频信号采集前端电路分析
  • 智能合约运行原理
  • 本草纲目数字化:Spring Boot在中药实验管理中的应用
  • 【Pytorch】torch.utils.data模块
  • .NET 9与C# 13革新:新数据类型与语法糖深度解析
  • 【课堂笔记】隐私计算实训营第四期:匿踪查询PIR
  • 【软件测试】自动化常用函数
  • 拼多多式社交裂变在欧美市场的困境与突破:Web3 增长的新思考
  • Spring Boot核心概念:应用配置
  • 企事业单位的敏感数据怎么保护比较安全?
  • 嵌入式学习-C嘎嘎-Day03
  • 单片机学习笔记 1. 点亮一个LED灯
  • 创建型设计模式(模版方法、观察者模式、策略模式)
  • 网络安全实施方案
  • 关联度分析、灰色预测GM(1,1)、GM(1,1)残差模型——基于Python实现
  • 类和对象——static 成员,匿名对象(C++)
  • OAI-5G开源通信平台实践(三)
  • linux 软连接的使用
  • tensorflow有哪些具体影响,和chatgpt有什么关系
  • [Unity]【游戏相关】 游戏设计基础:如何创建有效的游戏设计文档
  • C++常用库
  • Git错误:gnutls_handshake() failed: The TLS connection was non-properly terminated