java堆排序原理与实现方法分析

 更新时间:2018年12月26日 11:38:38   作者:_almost_  
这篇文章主要介绍了java堆排序原理与实现方法,结合实例形式分析了java堆排序的相关原理、实现方法与操作注意事项,需要的朋友可以参考下

本文实例讲述了java堆排序原理与实现方法。分享给大家供大家参考,具体如下:

堆是一个数组,被看成一个近似完全二叉树。

举例说明:

堆的性质:

1.已知元素在数组中的序号为i

其父节点的序号为 i/2的整数
其左孩子节点的序号为2*i
其右孩子节点的序号为2*i+1

2.堆分为最大堆和最小堆

在最大堆中,要保证父节点的值大于等于其孩子节点的值
在最小堆中,要保证父节点的值小于等于其孩子节点的值

java实现堆排序

public class MyHeapSort {
  public void Heap_Sort(int[] A) {
    /**
     * 这个函数完成堆排序
     * 先构建一个最大堆
     * 将数组中第一个元素和最后一个交换,
     * 堆的长度减一
     * 在从第一个位置开始保证堆的性质调用Max_heapify()函数。
     * 这样保证目前最大的元素在数组的最后位置。
     * 以此类推,直到最后一个元素。
     */
    Build_Max_Heap(A);
    for (int i = A.length - 1; i >= 1; i--) {
      int temp = A[0];
      A[0] = A[i];
      A[i] = temp;
      Max_heapify(A, 0, i);
    }
  }
  public void Build_Max_Heap(int[] A) {
    /**
     * 这个函数用来构建堆
     * A:待排序的数组
     * (for循环中i的值从数组长度的一般开始取,是因为完全二叉树的性质,
     * 一半的节点叶根节点所以从叶节点开始向上遍历来保证堆的性质)
     */
    for (int i = A.length/2; i >= 0; i--) {
      Max_heapify(A, i, A.length);
    }
  }
  public void Max_heapify(int[] A, int i, int heap_size) {
    /**这个函数用来维护堆的性质,
     * 保证以序号为i的元素为根节点的子树中,父节点的值大于其孩子节点的值。
     * A:待排序数组
     * i:在数组A中的序号
     * heap_size:堆的大小
     */
    int largest = i;
    int l = i * 2 + 1;
    int r = i * 2 + 2;
    if (l < heap_size && A[l] > A[i]) largest = l;
    if (r < heap_size && A[r] > A[largest]) largest = r;
    if (largest != i) {
      int temp = A[i];
      A[i] = A[largest];
      A[largest] = temp;
      Max_heapify(A, largest, heap_size);
    }
  }
  public static void main(String[] args) throws Exception {
    System.out.println("脚本之家测试结果:");
    int[] a = new int[]{1,3,2,5,34,23,44,15,67,45};
    new MyHeapSort().Heap_Sort(a);
    for (int x : a) System.out.println(x);
  }
}

代码中例子的运行结果:

PS:这里再为大家推荐一款关于排序的演示工具供大家参考:

在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具:
http://tools.jb51.net/aideddesign/paixu_ys

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java实现List集合转树形结构的示例详解

    Java实现List集合转树形结构的示例详解

    在开发中,我们通常需要将从数据库中查询的集合数据转换成类似文件系统一样的树形集合。本文将利用Java语言实现这一功能,感兴趣的可以了解一下
    2022-08-08
  • AI算法实现五子棋(java)

    AI算法实现五子棋(java)

    这篇文章主要为大家详细介绍了AI算法实现五子棋,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • SpringBoot中@Configuration和@Bean和@Component相同点详解

    SpringBoot中@Configuration和@Bean和@Component相同点详解

    这篇文章主要介绍了SpringBoot中@Configuration和@Bean和@Component相同点详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 详解Eclipse安装SVN插件的两种方法

    详解Eclipse安装SVN插件的两种方法

    这篇文章主要介绍了详解Eclipse 安装 SVN 插件的两种方法,详细的介绍了这两种安装方法,具有一定的参考价值,有兴趣的可以了解一下
    2018-01-01
  • Springboot配置文件相关说明解析

    Springboot配置文件相关说明解析

    这篇文章主要介绍了Springboot配置文件相关说明解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • SpringBoot实现多数据源的实战案例

    SpringBoot实现多数据源的实战案例

    这篇文章主要介绍了SpringBoot实现多数据源的实战案例,文中通过示例代码和图文展示介绍的非常详细,对大家的学习或工作有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2024-01-01
  • java中生成任意之间数的随机数详解

    java中生成任意之间数的随机数详解

    这篇文章主要介绍了java中生成任意之间数的随机数详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java 中的类和对象详情

    Java 中的类和对象详情

    这篇文章主要介绍了Java 中的类和对象,类可以看成是创建Java对象的模板,下面文章围绕着Java 类与对象详细内容展开,需要的朋友可以参考一下
    2021-11-11
  • Java数组的动态初始化和常见问题解析

    Java数组的动态初始化和常见问题解析

    本文介绍了数组动态初始化的概念,即在初始化时仅指定数组长度,系统会为数组分配初始值,而静态初始化则手动指定数组元素,系统根据元素个数计算数组长度,这两种初始化方式应用场景不同,另外,还讲述了数组默认初始化值的规律及数组常见问题,如越界问题等
    2024-10-10
  • 如何解决Java程序包不存在问题

    如何解决Java程序包不存在问题

    在使用IDEA 2022版本和Maven项目中,可能遇到Java程序包不存在的问题,这是由于IDEA的小bug引起的,文章提供了两种解决方法:第一种是在IDEA的Settings中配置,并在pom.xml中添加特定代码刷新Maven;第二种是通过IDEA的设置菜单修改Maven导入配置
    2024-10-10

最新评论