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

堆排序详解(JAVA版)

packagecom.hsit.heap;importjava.util.Scanner;****authorColo*version创建时间:2011-11-1上午


package com.hsit.heap;import java.util.Scanner;/*** * @author Colo* @version 创建时间:2011-11-1 上午11:44:10*/
public class Heap {private int[] data;/*输入数组元素,数组下标从1开始*/public void input() {System.out.println("请输入数组大小");Scanner scanner &#61; new Scanner(System.in);int n &#61; scanner.nextInt();data &#61; new int[n &#43; 1];System.out.println("输入数组元素");for (int i &#61; 1; i <&#61; data.length-1; i&#43;&#43;) {data[i] &#61; scanner.nextInt();}System.out.println("输入完成");}/*** 调整堆&#xff0c;使其满足堆得定义* &#64;param i* &#64;param n*/public void adjust(int i, int n) {int child;for (; i <&#61; n / 2; ) {child &#61; i * 2;if(child&#43;1<&#61;n&&data[child] 0; i--)adjust(i, data.length-1);for (int i &#61; data.length-1; i > 0; i--) {/*把根节点跟最后一个元素交换位置&#xff0c;调整剩下的n-1个节点&#xff0c;即可排好序*/swap(1, i);adjust(1, i - 1);}}public void swap(int i, int j) {int temp &#61; data[i];data[i] &#61; data[j];data[j] &#61; temp;}public void print() {for (int i &#61; 1; i

建堆


  如上&#xff0c;首先第一步&#xff0c;在对应的数组元素A[i], 左孩子A[LEFT(i)], 和右孩子A[RIGHT(i)]中找到最大的那一个&#xff0c;将其下标存储在child中。如果A[i]已经就是最大的元素&#xff0c;则程序直接结束。否则&#xff0c;i的某个子结点为最大的元素&#xff0c;将其&#xff0c;即A[child]与A[i]交换&#xff0c;从而使i及其子女都能满足最大堆性质。下标child所指的元素变成了A[i]的值&#xff0c;会违反最大堆性质&#xff0c;所以对child所指元素为根的子树重新调整。如下&#xff0c;是此adjust的演示过程&#xff08;下图是把4调整到最底层&#xff0c;一趟操作&#xff0c;但摸索的时间为LogN&#xff09;&#xff1a;

 

     由上图&#xff0c;我们很容易看出&#xff0c;初始构造出一最大堆之后&#xff0c;在元素A[i]&#xff0c;即16&#xff0c;大于它的俩个子结点4、10&#xff0c;满足最大堆性质。所以&#xff0c;i下调指向着4,小于,左子14&#xff0c;所以&#xff0c;调用adjust&#xff0c;4与其子&#xff0c;14交换位置。但4处在了14原来的位置之后&#xff0c;4小于其右子8&#xff0c;又违反了最大堆的性质&#xff0c;所以再递归调用adjust&#xff0c;将4与8&#xff0c;交换位置。于是&#xff0c;满足了最大堆性质&#xff0c;程序结束。



排序

以下是&#xff0c;堆排序算法的演示过程&#xff08;通过&#xff0c;顶端最大的元素与最后一个元素不断的交换&#xff0c;交换后又不断的调用adjust重新维持最大堆的性质&#xff0c;最后&#xff0c;一个一个的&#xff0c;从大到小的&#xff0c;把堆中的所有元素都清理掉&#xff0c;也就形成了一个有序的序列。这就是堆排序的全部过程。&#xff09;&#xff1a;

 

 

上图中&#xff0c;a->b&#xff0c;b->c&#xff0c;....之间&#xff0c;都有一个顶端最大元素与最小元素交换后&#xff0c;调用adjust的过程&#xff0c;而要完成整个堆排序的过程&#xff0c;共要经过O&#xff08;n&#xff09;次这样的adjust操作。所以&#xff0c;才有堆排序算法的运行时间为O&#xff08;n*lgn&#xff09;。






推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
author-avatar
手机用户2602904645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有