服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - java堆排序概念原理介绍

java堆排序概念原理介绍

2021-06-07 13:58Java教程网 Java教程

在本篇文章里我们给大家分享了关于java堆排序的概念原理相关知识点内容,有需要的朋友们可以学习下。

堆排序介绍:

堆排序可以分为两个阶段。在堆的构造阶段,我们将原始数组重新组织安排进一个堆中;然后在下沉排序阶段,我们从堆中按顺序取出所有元素并得到排序结果。

1.堆的构造,一个有效的方法是从右到左使用sink()下沉函数构造子堆。数组的每个位置都有一个子堆的根节点,sink()对于这些子堆也适用,如果一个节点的两个子节点都已经是堆了,那么在该节点上调用sink()方法可以把他们合并成一个堆。我们可以跳过大小为1的子堆,因为大小为1的不需要sink()也就是下沉操作,有关下沉和上浮操作可以参考我写的优先队列那篇。

2.堆的排序,我们通过第一步操作构造了一个堆,在这个堆中,根节点永远是最大值的节点,所以我们把根节点的值与数组最后的值进行交换,在使用sink()下沉来维护堆的结构即可。

具体代码实现:

java" id="highlighter_120917">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class pqsort{
  public static void main(string[] args){
    int[] a = {9,1,7,5,3,9,12,56,21,45};
    sort(a);
    for(int i=0;i<a.length;i++) {
      system.out.print(a[i]+" ");
    
  }
  //排序方法
  public static void sort(int[] a){
      int n = a.length-1;
      //通过下沉操作构造堆,因为下标从0开始,所以子节点为2*k+1和2*k+2;
      for(int k = (n-2)/2;k>=0;k--){
        sink(a,k,n);
      }
      //通过不断把堆中最大值放到数组的后面来排序
      while(n>0){
        exch(a,0,n--);
        sink(a,0,n);
      }
  }
  //下沉函数
  private static void sink(int[] a, int i, int n){
    while(2*i+1<=n){
      int j = 2*i+1;
      if(j<n&&a[j]<a[j+1]) j++;
      if(a[i]>a[j]) break;
      exch(a,i,j);
      i=j;
    }
  }
  //交换函数
  private static void exch(int[] a, int i, int j){
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }
}

运行结果:

java堆排序概念原理介绍

延伸 · 阅读

精彩推荐
  • Java教程java之this关键字用法实例分析

    java之this关键字用法实例分析

    这篇文章主要介绍了java之this关键字用法实例分析,较为详细的讲述了Java中this关键字的用法及适用范围,并附带实例程序加以说明,需要的朋友可以参考下 ...

    shichen20144582019-12-01
  • Java教程java实现的新浪微博分享代码实例

    java实现的新浪微博分享代码实例

    这篇文章主要介绍了java实现的新浪微博分享代码实例,是通过新浪API获得授权,然后接受客户端请求的数据,第三方应用发送请求消息到微博,唤起微博分...

    hebedich4452019-12-13
  • Java教程Scala 操作Redis使用连接池工具类RedisUtil

    Scala 操作Redis使用连接池工具类RedisUtil

    这篇文章主要介绍了Scala 操作Redis使用连接池工具类RedisUtil,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    Gavin-Feng11422019-06-29
  • Java教程JVM真香系列:Java文件到.Class文件

    JVM真香系列:Java文件到.Class文件

    JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们...

    今日头条4782020-11-17
  • Java教程eclipse 中的javac命令与java命令

    eclipse 中的javac命令与java命令

    这篇文章主要介绍了eclipse javac命令与java命令的相关资料,需要的朋友可以参考下 ...

    java教程网1592020-07-18
  • Java教程java获取properties属性文件示例

    java获取properties属性文件示例

    Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。本文使用java读取这些属性,看下...

    java技术网3732019-10-27
  • Java教程java解析xml之sax解析xml示例分享

    java解析xml之sax解析xml示例分享

    SAX基于事件的解析,解析器在一次读取XML文件中根据读取的数据产生相应的事件,由应用程序实现相应的事件处理逻辑,即它是一种“推”的解析方式;这...

    java技术网2232019-10-27
  • Java教程Java使用JDBC实现Oracle用户认证的方法详解

    Java使用JDBC实现Oracle用户认证的方法详解

    这篇文章主要介绍了Java使用JDBC实现Oracle用户认证的方法,结合实例形式分析了java使用jdbc实现数据库连接、建表、添加用户、用户认证等操作流程与相关注...

    冷豪2342020-12-20