广告
返回顶部
首页 > 资讯 > 精选 >深入浅析java中堆排序的原理
  • 336
分享到

深入浅析java中堆排序的原理

java堆排序ava 2023-05-31 16:05:32 336人浏览 安东尼
摘要

本篇文章为大家展示了深入浅析java中堆排序的原理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。从堆排序的简介到堆排序的算法实现等如下:1. 简介  堆排序是建立在堆这种数据结构基础上的选择排序,是

本篇文章为大家展示了深入浅析java中堆排序的原理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

从堆排序的简介到堆排序的算法实现等如下:

1. 简介

  堆排序是建立在堆这种数据结构基础上的选择排序,是原址排序,时间复杂度O(nlogn),堆排序并不是一种稳定的排序方式。堆排序中通常使用的堆为最大堆。   

2. 堆的定义

  堆是一种数据结构,是一颗特殊的完全二叉树,通常分为最大堆最小堆。最大堆的定义为根结点最大,且根结点左右子树都是最大堆;同样,最小堆的定义为根结点最小,且根结点左右子树均为最小堆。

  最大堆满足其每一个父结点均大于其左右子结点,最小堆则满足其每一个父结点均小于其左右子结点。

3. 堆排序

3.1 堆的存放

  在堆排序中,堆所表示的二叉树并不需要使用指针的方式在计算机中存放,只需要使用数组即可,将树的结点,从上至下,从左至右一个个放到数组中去。

   因此,如果数组的起始索引为0,对于一个结点i来说,它的父结点索引为⌊i/2⌋,它的左子结点索引为2i+1,右子结点索引为2i+2。最后一个非叶子节点就是最后一个结点的父亲,如果数组长度为n,那么其索引为⌊(n-1)/2⌋。

3.2 堆排序主要步骤

将无序序列构建成最大堆

将数组分成两个区域,有序区和无序区,初始时创建一个整数i为数组的长度,用来划分有序区和无序区,有序区初始为空。

将堆顶元素和最后一个无序区的元素交换,然后i-1。

调整使得所有无序区的元素重新为最大堆。

重复3,4步,直到 i = 0

3.3 堆的调整

  假设有某棵完全二叉树,其左右子树均为最大堆,如何调整使得该二叉树成为最大堆呢?如果根结点大于左右子结点,那么已经是最大堆了,无需调整。否则,交换根结点和左右子结点中较大的那个。假设交换的是左结点,那么目前这棵完全二叉树右子树仍然是一个最大堆,左子树则不一定,但是左子树的左右子树还是最大堆,因此不断递归下去调整即可。

   因此,交换最后一个元素和堆顶元素后的调整步骤,就和上面所说的一致。而将无序序列构建成最大堆,同样也可以运用这一点。从最后一个非叶子结点到第一个非叶子结点(根结点),对这些结点作为根结点的子树,按顺序调用一次上述描述的调整即可(每次调用时,该子树的左右子树必定是最大堆)。

4. 算法实现

#include <stdio.h>void swap(int *a,int *b) { int temp = *a; *a = *b; *b = temp;}//左右子树都是最大堆,从上至下调整使得最大堆, root_index是要调整的树的根节点,length是无序区的长度void adjust(int array[],int root_index,int length) { int left_child = root_index*2+1; int right_child = left_child+1; int left_or_right = 0; if((left_child >= length && right_child >= length) || (left_child >= length && array[root_index] >= array[right_child]) || (right_child >= length && array[root_index] >= array[left_child]) || (array[root_index] >= array[left_child] && array[root_index] >= array[right_child])){  return; } else if (array[left_child] >= array[root_index] && (right_child >= length || array[left_child] >= array[right_child])) {  left_or_right = 1; } else if (array[right_child] >= array[root_index] && (left_child >= length || array[right_child] >= array[left_child])) {  left_or_right = 0; } if(left_or_right) {  swap(&array[left_child],&array[root_index]);  adjust(array,left_child,length); } else {  swap(&array[right_child],&array[root_index]);  adjust(array,right_child,length);   }}//heapsort主递归,每一次将无序区最后一个元素与堆顶元素交换,将堆顶元素加入有序区,因此有序区加1,无序区减1,无序区只剩一个元素的时候递归终止void heapsort_main(int array[],int length,int last_index) { int i; if(last_index == 0)  return; swap(&array[0],&array[last_index]); adjust(array,0,last_index); heapsort_main(array,length,last_index-1);} //入口函数,array是待排序的数组,length是其长度void heapsort(int array[],int length) { int i; for(i = length/2-1;i >= 0;i--) {  adjust(array,i,length); } heapsort_main(array,length,length-1);}int main(int arGC,char *argv[]) { int array[9] = {1,1,1,2,3,5,2,3,5}; heapsort(array,9); int i; for(i = 0;i < 9;i++) {  printf("%d ",array[i]); }}

--结束END--

本文标题: 深入浅析java中堆排序的原理

本文链接: https://www.lsjlt.com/news/226984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入浅析java中堆排序的原理
    本篇文章为大家展示了深入浅析java中堆排序的原理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。从堆排序的简介到堆排序的算法实现等如下:1. 简介  堆排序是建立在堆这种数据结构基础上的选择排序,是...
    99+
    2023-05-31
    java 堆排序 ava
  • 深入浅析java中的排序方法
    这篇文章给大家介绍深入浅析java中的排序方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。排序1、概念:有n个记录的序列{R1,R2,.......,Rn}(此处注意:1,2,n 是下表序列,以下是相同的作用),其相...
    99+
    2023-05-31
    java 排序 ava
  • 深入浅析Java中 JVM的原理
    这篇文章将为大家详细讲解有关深入浅析Java中 JVM的原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真...
    99+
    2023-05-31
    java jvm ava
  • 深入浅析java中的简单选择排序
    这篇文章将为大家详细讲解有关深入浅析java中的简单选择排序,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。选择排序的基本算法思想:每一趟在 n-i+1 (i=1,2,3,……,n-1)个记录...
    99+
    2023-05-31
    java 简单选择排序 ava
  • 深入浅析java中反射的原理
    深入浅析java中反射的原理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.Class类任何一个类都是Class的实例对象,这个实例对象有三种表示方式//第一种表示方式---...
    99+
    2023-05-31
    java 反射 ava
  • 深入浅析JAVA中封装的原理
    本篇文章为大家展示了深入浅析JAVA中封装的原理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。第一节 什么是JAVA中的封装面向对象的三大特性:封装、继承、多态。概念:将类的某些信息隐藏在类的内部,...
    99+
    2023-05-31
    java 封装 ava
  • 深入浅析Java中线程池的原理
    这篇文章将为大家详细讲解有关深入浅析Java中线程池的原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。ThreadPoolExecutor简介ThreadPoolExecutor是线程池类...
    99+
    2023-05-31
    java ava 线程池
  • 深入浅析Java中输出HelloWorld的原理
    今天就跟大家聊聊有关深入浅析Java中输出HelloWorld的原理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。我们初学java的第一个程序是"hello world&q...
    99+
    2023-05-31
    java helloworld ava
  • 深入浅析java 中volatile与lock的原理
    深入浅析java 中volatile与lock的原理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 中volatile和lock原理分析volatile和lock是...
    99+
    2023-05-31
    java volatile lock
  • 深入浅析java 中HashMap的实现原理
    这篇文章将为大家详细讲解有关深入浅析java 中HashMap的实现原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. HashMap的数据结构数据结构中有数组和链表来实现对数据的存储,...
    99+
    2023-05-31
    java hashmap ava
  • 深入浅出解析Java ThreadLocal原理
    目录1.了解ThreadLocal简介使用2.源码解析 – 探究实现思路threadLocals变量与ThreadLocalMapset(T value) 方法get() 方法rem...
    99+
    2022-11-12
  • 深入浅析java 1.8 中动态代理的原理
    这篇文章将为大家详细讲解有关深入浅析java 1.8 中动态代理的原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JDK8动态代理源码分析动态代理的基本使用就不详细介绍了:例子:class...
    99+
    2023-05-31
    java 动态代理 ava
  • 深入浅析Java中的AtomicLongArray原子类
    本篇文章为大家展示了深入浅析Java中的AtomicLongArray原子类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。AtomicLongArray介绍和函数列表 AtomicLong...
    99+
    2023-05-31
    java atomiclongarray 原子类
  • 深入浅析HashMap的工作原理
    这篇文章给大家介绍深入浅析HashMap的工作原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集...
    99+
    2023-05-31
    hashmap
  • 深入浅析Java 中的CharArrayReader
    深入浅析Java 中的CharArrayReader?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CharArrayReader 介绍CharArrayRead...
    99+
    2023-05-31
    java chararrayreader ava
  • 深入浅析Java 中的LockSupport
    这期内容当中小编将会给大家带来有关深入浅析Java 中的LockSupport,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。LockSupport介绍LockSupport是用来创建锁和其他同步类的基本线...
    99+
    2023-05-31
    java pp locksupport
  • 深入浅析Java中的 FilterInputStream
    这期内容当中小编将会给大家带来有关深入浅析Java中的 FilterInputStream,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。FilterInputStream 介绍FilterInputStr...
    99+
    2023-05-31
    java filterinputstream npu
  • 深入浅析Java中拆箱与自动装箱的原理
    这篇文章给大家介绍深入浅析Java中拆箱与自动装箱的原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是自动装箱和拆箱自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象...
    99+
    2023-05-31
    java 自动装箱 拆箱
  • Java深入浅出分析Synchronized原理与Callable接口
    目录一、基本特点二、加锁工作过程偏向锁轻量级锁重量级锁三、其他的优化操作锁消除锁粗化四、Callable 接口一、基本特点 1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁....
    99+
    2022-11-13
  • 深入浅析Java中的 concurrency锁
    本篇文章给大家分享的是有关深入浅析Java中的 concurrency锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。根据锁的添加到Java中的时间,Java中的锁,可以分为&...
    99+
    2023-05-31
    java concurrency ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作