热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java大顶堆类,构建大顶堆、堆排序实现(java)

构建大顶堆、堆排序实现(java)构建大顶堆、堆排序实现(java)堆排序介绍:①堆排序是利用堆的数据结构设计的一种排序算法,堆排序是一种选择排序,时间复杂度为O(nlogn),是

构建大顶堆、堆排序实现(java)

构建大顶堆、堆排序实现(java)

堆排序介绍:

①堆排序是利用堆的数据结构设计的一种排序算法,堆排序是一种选择排序,时间复杂度为O(nlogn),是不稳定排序;

②堆是具有以下性质的完全二叉树:每个节点的值都大于或者等于其左右孩子节点的值,称为大顶堆;(没有要求其左右孩子节点的值谁大谁小)

③每个节点的值都小于或者等于其左右孩子节点的值,称为小顶堆

《java大顶堆类,构建大顶堆、堆排序实现(java)》

对堆中的节点按层进行编号,映射到数组中:

《java大顶堆类,构建大顶堆、堆排序实现(java)》

大顶堆的特点:

arr[i] >= arr[2 * i + 1] && arr[i] >= arr[2 * i + 2]; //i对应的是第几个节点,i从0开始

《java大顶堆类,构建大顶堆、堆排序实现(java)》

小顶堆特点:

arr[i] <= arr[2 * i + 1] && arr[i] <= arr[2 * i + 2]; //i对应第几个节点,i从0开始编号

一般升序的时候采用大顶堆,降序的时候采用小顶堆

堆排序的基本思想:

①将待排序序列构造成一个大顶堆

②此时,整个序列的最大值就是堆顶的根节点

③将其与末尾元素进行交换,此时末尾就是最大值

④然后将剩余 n-1 个元素重新调整成一个堆,这样会得到n个元素的次小值,反复执行,就能得到一个有序序列

在构建大顶堆的过程中,元素的个数逐渐减少,最后就能得到一个有序序列;

例如: 将{4,6,8,5,9}使用堆排序,将数组升序排序

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

《java大顶堆类,构建大顶堆、堆排序实现(java)》

调整大顶堆代码

/**

* 功能:完成将以 i 对应的非叶子节点的树调整成为大顶堆

*

* @param arr 待调整的数组

* @param i 表示非叶子节点在数组中的索引

* @param length 表示对多少个元素进行调整,每排序好一趟,length的长度就减1

*/

public static void adjustHeap(int[] arr, int i, int length) {

int temp = arr[i]; //先取出当前元素的值,保存在临时变量中

//开始调整

//1.k = i * 2 + 1 是i 节点的左子节点

for (int k = i * 2 + 1; k

if (k + 1

k++; //k指向右子节点,目的是为了找到左右孩子节点中的最大值

}

if (arr[k] > temp) { //如果子节点大于父节点,说明需要调整

arr[i] = arr[k]; //把较大的值作为当前的树的父节点

i = k; // i 指向 k,继续循环比较

} else {

break;

}

}

//当for循环结束后,已经将以 i 为父节点的树的最大值,放在了顶端(局部)

arr[i] = temp; //将temp值放到调整后的位置

}

堆排序代码:

public static void heapSort(int[] arr) {

System.out.println(&#8220;堆排序&#8221;);

//将无序序列构建成一个大顶堆

for (int i = arr.length / 2 &#8211; 1; i >= 0; i&#8211;) {

adjustHeap(arr, i, arr.length);

}

//将堆顶元素和末尾元素进行交换,将最大的数放到数组的末尾

//再重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行 调整+交换 步骤,直到整个序列有序

for (int j = arr.length &#8211; 1; j >= 0; j&#8211;) {

//交换

int temp = arr[j];

arr[j] = arr[0];

arr[0] = temp;

adjustHeap(arr, 0, j);

}

// System.out.println(&#8220;调整后的数组 = &#8221; + Arrays.toString(arr));

}

构建大顶堆、堆排序实现(java)相关教程

每日算法&#8212;-删除排序数组中的重复项&#8212;-202010/5(4/4)(补)

每日算法&#8212;-删除排序数组中的重复项&#8212;-202010/5(4/4)(补) 目录 1. 题目描述 2. 示例 3. 思路 4. 遇上的问题 5. 具体实现代码 6. 学习收获,官方一如既往的妙啊 7 题目来源 1. 题目描述 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元

冒泡排序时间 / 空间复杂度

冒泡排序时间 / 空间复杂度 ** 借鉴转载自十大经典排序算法 ** 十大算法复杂度: 冒泡排序 思想: 两两比较,A[i+1]A[i] 交换位置,循环i次 代码实现: class Solution { public static void main(String[] args) { int[] array = new int[]{2,2,3,1}; for(in

【排序】插入排序

【排序】插入排序 1、插入排序法介绍 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 2、插入排序法思想 插入排序(Insertion Sorting)的基本思想是: 把n个待排序的元素看成为一个有序表和一个无序表

php如何实现排序算法

php实现排序算法的方法:1、冒泡排序,两两相比,每循环一轮就不用再比较最后一个元素;2、选择排序,选定一个作为基本值,剩下的和这个比较,再调换位置。 php实现排序算法的方法: 1、冒泡排序: 两两相比,每循环一轮就不用再比较最后一个元素了,因为最

LeetCode第 426 题:将二叉搜索树转化为排序的双向链表(C++)

LeetCode第 426 题:将二叉搜索树转化为排序的双向链表(C++) 426. 将二叉搜索树转化为排序的双向链表 一样的剑指 Offer 36. 二叉搜索树与双向链表_zj-CSDN博客,中序遍历一边遍历一边调整指针 class Solution {public: //left, right对应前驱、后继 Node *hea

C++ partial_sort(部分排序)

C++ partial_sort(部分排序) 参考:http://c.biancheng.net/view/564.html 假设有一个容器,它保存了 100 万个数值,但我们只对其中最小的 100 个感兴趣。可以对容器的全部内容排序,然后选择前 100 个元素,但这可能有点消耗时间。这时候需要使用部分排序

牛客IOI周赛19-普及组 A:小y的考试 (自定义排序)

牛客IOI周赛19-普及组 A:小y的考试 (自定义排序) 吐槽:这道题没什么难的,题意也很好懂,但是我竟然忘了 自定义排序函数时使用时还需要加上cmp,结果就很尴尬了,另外 sort 的时候也要注意数组的范围 sort(0,3) 只能将数组中 [0,3) 中的数进行排序 。 题面: 水题

按字典值排序&#8211;找出大小最大的十个文件

按字典值排序&#8211;找出大小最大的十个文件 问题分析: 需要确认某路径下所有文件的大小 需要排序,找出最大的十个 以字典的形式保存数据 准备知识: operator模块: fun = operator.itemgetter(1), fun 是一个由operator.itemgetter(1) 返回的函数,当函数fun作


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
zhengxing
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有