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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【七、堆排序】 -> 正文阅读

[数据结构与算法]【七、堆排序】

堆排序:
1.先创建好大根堆
2.每一趟将堆顶元素加入有序子序列【即将堆顶元素与待排序序列中的最后一个元素交换】
3.将待排序元素序列再次调整为大根堆

图解:

书上代码是从i=1存储元素,相当于在i=4(i=len/2)时调整
下处代码是从i=0存储元素,所以在i=3(i=len/2-1)时调整

在这里插入图片描述

public class 堆排序 {
    public static void main(String[] args) {
//        int nums[]={1,3,4,5,2};
        int nums[]={49,38,65,97,76,13,27,49,55,04};
        sort(nums);
        System.out.println(Arrays.toString(nums));
    }
    static void sort(int nums[]){
        int len = nums.length;
        BuildMaxHeap(nums);     //建立初始堆
        for (int i=len-1;i>0;i--){
            swap(nums,i,0); //将堆顶元素输出(和堆底元素交换)
            HeadAdjust(nums,0,i);   //重新调整为新堆
        }
    }

    //建立大根堆
    static void BuildMaxHeap(int nums[]){
        int len = nums.length;
        for(int i=len/2-1;i>=0;i--){
            HeadAdjust(nums,i,nums.length); //反复调整堆,使其成为大根堆
        }
    }

    static void HeadAdjust(int[] nums, int k, int len) {
        int temp=nums[k];       //暂存子树的根节点
        //i=i*2+1找到 所调整结点的左子树
        //i=i*2+1是确保调整后的 “子树”  也能保持大根堆状态
        //如果调整后,“调整结点所在子树” 不能保证大根堆,i=i*2+1发挥作用,重新调整子树
        for (int i =2*k+1;i<len;i=i*2+1){
            if (i+1<len&&nums[i]<nums[i+1]) //比较孩子结点
                i++;                        //取key较大的子结点的下标
            if (temp>=nums[i]) break;       //筛选结束
            else{
                nums[k]=nums[i];            //将nums[i]调整到双亲结点上
                k=i;                        //修改key值,以便能够继续向下筛选
            }
        }
        nums[k]=temp;                       //被筛选结点的值放入最终位置
    }

    static void swap(int nums[],int a,int b){
        int temp = nums[a];
        nums[a]=nums[b];
        nums[b]=temp;
    }

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:31:32-

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