堆排序是利用这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。

  堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值。

堆排序的基本思路:

  a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

  b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;

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

升序排序,则构建大顶堆。

package nuc.edu.lisheng;import java.util.Arrays;public class HeapSort {public static void main(String[] args) {int[] a = { 58, 4, 5, 9, 36, 27, 1, 3, 58 };HeapSortFianl(a);System.out.println(Arrays.toString(a));}//是否排序完成public static boolean ifend(int[] a) {// true代表还要继续,即没有排序好boolean ifend = true;A: for (int index = a.length - 1; index > 0; index--) {if (a[index] < a[index - 1]) {ifend = false;break A;}}return ifend;}//判断a是否为奇数。(从0开始)完全二叉树中奇数索引在左,偶数索引在右。左右对应的交换操作斌不相同public static boolean odd(int a) {if (a % 2 == 0) {return false;} else {return true;}}//左右节点与父节点比较大小,交换public static void sortHeap(int[] a, int i, int changeIndex) {//如果是偶数if (!odd(i)) {int left = i - 1;int father = (i - 1) / 2;if (a[i] > a[father]) {int num = a[i];a[i] = a[father];a[father] = num;}if (a[left] > a[father]) {int num = a[left];a[left] = a[father];a[father] = num;}} else {//如果是奇数,且在可操作的最后一位,那么没有右节点,直接比较左节点即可if (i == changeIndex) {int father = i / 2;if (a[i] > a[father]) {int num = a[i];a[i] = a[father];a[father] = num;}} else {//左右都有,都比较int right = i + 1;int father = i / 2;if (a[i] > a[father]) {int num = a[i];a[i] = a[father];a[father] = num;}if (a[right] > a[father]) {int num = a[right];a[right] = a[father];a[father] = num;}}}}public static void getMaxHeap(int[] a, int changeIndex) {//从可操作的最后一位往后比较,直到1为止。for (int i = changeIndex; i > 0; i--) {sortHeap(a, i, changeIndex);}}//可操作的最后一位与守卫交换public static void changeFirstAndEnd(int[] a, int changeIndex) {int num = a[changeIndex];a[changeIndex] = a[0];a[0] = num;}public static void HeapSortFianl(int[] a) {int changeIndex = a.length - 1;A: while (true) {getMaxHeap(a, changeIndex);changeFirstAndEnd(a, changeIndex);changeIndex--;if (ifend(a)) {break A;}}}
}

结果:

堆排序 Java实现相关推荐

  1. 堆排序java实例_堆排序(示例代码)

    前言:网上有很多堆排序的案例,我只想写自己堆排序. 一:堆结构 即:一个父节点最多只能有两个子节点(可以没有),如下图 图1        图2           图3       图4 二: 数组 ...

  2. 堆排序-Java小顶堆排序

    二叉堆满足二个特性:  1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆).  当父结点的键值总是大于或等于任何一个子 ...

  3. java 小根堆 排序_堆排序(java实现)

    堆排序就是用大根堆或者小根堆的节点都比左孩子 右孩子大(小)的特性  来构建有序序列. 名词解释: 大根堆:所有节点(n)都比他的左孩子(2n+1)与右孩子(2n+2)大的完全二叉树. 小根堆:所有节 ...

  4. 堆排序Java实现以及使用场景

    堆排序是基于大小堆来实现的,利用数组中左右子树的数学规律来进行构建最大树或者是最小树,在这基础上将最大数或者是最小树下沉,并将树的长度减1,直到树的长度为1,最后数组即为排序后的数组 场景:跟快排一样 ...

  5. 大顶堆排序java实现

    堆的性质:  (1)性质:完全二叉树或者是近似完全二叉树:  (2)分类:大顶堆:父节点不小于子节点键值,小顶堆:父节点不大于子节点键值:图展示一个最小堆: (3)左右孩子:没有大小的顺序. (4)堆 ...

  6. 堆维护、堆建立、堆排序-- java实现

    //堆有三个操作.维护堆,建堆,堆排序. public class heapsort { // 维护最大堆public static void maxheap(int nums[], int i,in ...

  7. 堆排序 java实现_堆排序Java实现(递归方式非递归方式)

    很早就学习了堆排序但当时没有用代码实现,现在再去想实现已经忘光光啦┑( ̄Д  ̄)┍,于是就去网上搜了一番,发现没有一篇我能认真看完的文章,没办法就是没耐心,就是笨呗...好了,言归正传= ̄ω ̄= 了解 ...

  8. 十大经典排序算法之堆排序(Java代码实现)

    算法原理 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近视完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点.堆排序可以说 ...

  9. 堆排序和归并排序 java代码实现

    文章目录 堆排序 java代码实现 单元测试 归并排序 java代码实现 单元测试 堆排序 java代码实现 package csdn.dreamzuora.sort;import java.util ...

  10. 数据连接java面试题

    本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~ 一.面向对象的特征都有哪些?他们在使用过程中的优势是什么? (1)对象唯一性 (2)抽象性 (3)继承性 (4)多态性 1.易 ...

最新文章

  1. Android.mk 用法介绍
  2. 学嵌入式Linux软件开发需要的知识
  3. python装饰器-python装饰器
  4. Matlab 中常用的直线与点形表示属性
  5. angular动态选择HTML模板,在angular2中动态加载HTML模板
  6. java 为什么序列化_java类为什么要序列化
  7. 通过康托逆展开生成全排列
  8. 网站logo放在服务器,自己建网站如何设计网站LOGO
  9. mysql 索引 简书_MySQL 索引
  10. 关于Struts+Spring+Hibernate的理解
  11. 42 WM配置-作业-库存盘点-定义默认设置
  12. python write函数换行_Python基础知识(三)
  13. 生存的关键往往在于偶然的机遇——李光耀
  14. 计算机应用水平excel考什么,全国专业技术人员计算机应用能力考试EXCEL2003中文字处理全真模拟试卷(三)...
  15. C#数据库教程2-ADO.NET常用SQL语句
  16. Binomial Coefficient(二项式系数)的计算
  17. 蜘蛛和露珠的故事(得不到的和失去的)
  18. WIN10装cygwin后,打开提示找不到mintty
  19. const的作用和用法
  20. 【揭密:刘强东9年密谋的商业布局—京东快物流背后的核心技术盘点】

热门文章

  1. 康华光电子技术基础第六版习题答案
  2. JAVA 仿QQ聊天程序
  3. 佳能MG2580S清零
  4. NoSQL数据库教程
  5. h5案例欣赏及分析_2019下半年,10个优秀H5案例参考
  6. 【金猿技术展】OceanBase 社区版——一款开源分布式HTAP数据库管理系统
  7. matlab yalmip cplex,关于 cplex+matlab+yalmip问题
  8. 小米android截屏快捷键是什么原因,小米截屏快捷键是什么 如何快速截图快捷键...
  9. slice_input_producer在2.0版本里怎么用_EPrime2.0安装避坑指南
  10. 详解Java的IO流Part7:PrintStream打印流【完结】