IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Carson带你学数据结构:堆排序,内存占用最少的排序算法 -> 正文阅读

[数据结构与算法]Carson带你学数据结构:堆排序,内存占用最少的排序算法


目录

示意图


1. 基础知识

堆的定义 = 具有下列性质的完全二叉树:


2. 简介

利用堆(大 / 小顶堆) 进行排序 的方法

  1. 充分利用了完全二叉树深度 = [log2n] + 1的特性
  2. 是 简单选择排序 的优化 & 改进

3. 算法原理

示意图


4. 算法示意图

初始状态 & 算法目标

具体算法


5. 算法实现

  • 具体请看注释
public class HeapSort {


    /**
     * 执行 堆排序 算法
     */
    public static void main(String[] args) {

        // 定义待排序数列
        int[] src = new int[]{ 50, 10, 90, 30, 70, 40, 80, 60, 20 };

        // 输出结果
        heapSort(src);

    }
    

    /**
     * 堆排序算法
     */
    private static void heapSort(int[] arr) {
        // 步骤1:将待排序的序列构建成一个大顶堆
        for (int i = arr.length / 2; i >= 0; i--){
            // i = i / 2 :求出非终端结点(即,具备孩子的结点)
            // 逐渐递减: i = 4-3-2-1
            heapAdjust(arr, i, arr.length);
        }

        
        for (int i = arr.length - 1; i > 0; i--) {
            // 步骤2:交换 根节点 与 末尾元素
            swap(arr, 0, i);
            // 步骤3:将序列剩余的(n-1)个记录重新构造成大顶堆
            heapAdjust(arr, 0, i);
            
            // 循环步骤2 、3,直到整个序列有序
        }

        // 输出排序后的序列
        for(int a =0;a<arr.length;a++)
            System.out.println(arr[a]);

    }

    /**
     * 构建堆的过程
     * 参数说明:
     * @param arr = 需排序的数组
     * @param i = 需要构建堆的根节点的序号
     * @param n = 数组的长度
     */
    private static void heapAdjust(int[] arr, int i, int n) {
        int child;
        int father;
        for (father = arr[i]; leftChild(i) < n; i = child) {
            child = leftChild(i);

            // 若左子树<右子树,则比较右子树和父节点
            if (child != n - 1 && arr[child] < arr[child + 1]) {
                child++; // 序号增1,指向右子树
            }

            // 若父节点<孩子结点,则需要交换
            if (father < arr[child]) {
                arr[i] = arr[child];
            } else {

                // 大顶堆结构未被破坏,不需要调整
                break;
            }
        }
        arr[i] = father;
    }

    // 获取左孩子结点 位置
    private static int leftChild(int i) {
        return 2 * i + 1;
    }


    // 交换元素位置
    private static void swap(int[] arr, int index1, int index2) {
        int tmp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = tmp;
    }



}
  • 测试结果
10
20
30
40
50
60
70
80
90

Demo地址:Carson_Ho的Github地址:堆排序


6. 性能分析

以下将分析算法的性能:时间复杂度、空间复杂度、稳定性
示意图


7. 应用场景

不适合待排序序列个数较少的情况

原因 = 初始构建堆的比较次数较多


8. 总结


欢迎关注Carson_Ho的CSDN博客

博客链接:https://carsonho.blog.csdn.net/


请点赞!因为你的鼓励是我写作的最大动力!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:08:35  更:2021-10-19 12:08:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:23:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码