基本概念:

  二叉堆是完全二叉树或者是近似完全二叉树。

  当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆

  当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆

  一般将二叉堆简称为堆。

 基本思想:

  1.把n个元素建立最大堆,把堆顶元素A[0]与待排序序列的最后一个数据A[n-1]交换;

  2.把剩下的n-1个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-2]交换;

  3.把剩下的n-2个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-3]交换;

  重复以上步骤,直到把最后两个元素建成最大堆并进行交换,得到的序列就是排序后的有序序列。

 

 堆排序是不稳定的排序算法,时间复杂度为:O(NlogN).

 Java实现:

  1. package sort;
  2. public class HeapSort{
  3. public static void main(String[] args)
  4. {
  5. new HeapSort().run();
  6. }
  7. public void run(){
  8. int [] a={,,,,,};
  9. int len=a.length;
  10. /**
  11. * 循环建堆
  12. */
  13. for(int i=;i<len-;i++){
  14. /**
  15. * 建堆,建一次最大堆,寻到一个待排序序列的最大数
  16. */
  17. buildMaxHeap(a,len--i);
  18. /**
  19. * 交换堆顶(待排序序列最大数)和最后一个元素
  20. */
  21. swap(a,,len--i);
  22. }
  23.  
  24. for(int j=;j<len;j++){
  25. System.out.print(a[j]+" ");
  26. }
  27. }
  28. /**
  29. * 对数组 从0到lastIndex建大顶堆
  30. */
  31. public void buildMaxHeap(int[] arr, int lastIndex){
  32. /**
  33. * 从最后一个节点(lastIndex)的父节点开始
  34. */
  35. for(int i=(lastIndex-)/;i>=;i--){
  36. /**
  37. * k保存正在判断的节点
  38. */
  39. int k=i;
  40. /**
  41. * 如果当前k节点的子节点存在
  42. */
  43. while(k*+<=lastIndex){
  44. /**
  45. * k节点的左子节点的索引
  46. */
  47. int biggerIndex=*k+;
  48. /**
  49. * 如果k节点的左子节点biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在
  50. */
  51. if(biggerIndex<lastIndex){
  52. /**
  53. * 若果右子节点的值较大
  54. */
  55. if(arr[biggerIndex]<arr[biggerIndex+]){
  56. /**
  57. * biggerIndex总是记录较大子节点的索引
  58. */
  59. biggerIndex++;
  60. }
  61. }
  62. /**
  63. * 如果k节点的值小于其较大的子节点的值 ,交换他们
  64. */
  65. if(arr[k]<arr[biggerIndex]){
  66. swap(arr,k,biggerIndex);
  67. /**
  68. * 将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值
  69. */
  70. k=biggerIndex;
  71. }else{
  72. /**
  73. * 当前判断结点k(父结点),大于他的两个子节点时,跳出while循环
  74. */
  75. break;
  76. }
  77. }
  78. }
  79. }
  80. /**
  81. * 交换下标为i、j的两个元素
  82. */
  83. private void swap(int[] data, int i, int j) {
  84. int tmp=data[i];
  85. data[i]=data[j];
  86. data[j]=tmp;
  87. }
  88. }

 结果展示:

  (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~) 

排序系列 之 堆排序算法 —— Java实现的更多相关文章

  1. 排序系列 之 快速排序算法 —— Java实现

    基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...

  2. 排序系列 之 归并排序算法 —— Java实现

    基本思想: 归并排序法是分治法的典型实例,分为分割和归并两部分. 把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并). 实例: 先分割成每个子序列只有一 ...

  3. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

  4. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  5. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  6. 堆排序算法(Java实现)

    将待排序的序列构造成一个大顶堆(从大到小排要构造成小顶堆).此时,整个序列的最大值就是堆顶的根节点,将他和末尾元素交换,然后将剩余的length-1个节点序列重新构造成新的堆.重复执行,便能得到一个有 ...

  7. 排序系列 之 折半插入排序算法 —— Java实现

    基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...

  8. 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  9. 排序算法入门之堆排序(Java实现)

    堆排序 在学习了二叉堆(优先队列)以后,我们来看看堆排序.堆排序总的运行时间为O(NlonN). 堆的概念 堆是以数组作为存储结构. 可以看出,它们满足以下规律: 设当前元素在数组中以R[i]表示,那 ...

随机推荐

  1. dubbo之本地伪装

    本地伪装 本地伪装 1 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败. 在 spring 配置文件中按以下方式配置: <dub ...

  2. js 获取 checkbox[] 值

    $("#btnAdd1").click(function () { console.log($("form").serialize()); var checkb ...

  3. 使用selenium实现模拟淘宝登陆

    from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.w ...

  4. linu下nginx的安装

    这里用到的环境是nginx-1.8.0,linux用的是CentOS-7-x86_64-DVD-1804.iso版本 1   什么是nginx Nginx ("engine x") ...

  5. 从0开始复习JS---1、函数复习

    1. 写一个函数,实现对数字数组的排序. function get_order(array){ for(var i = 0; i <array.length-1; i++){ for(var j ...

  6. enote笔记语言(5)——其他

    章节:其他   ((主:单词))                               用来醒目地强调这个句子中哪个词语作主语 sentence:                         ...

  7. 消除input框的默认样式

    input, button, select, textarea { outline: none; -webkit-appearance: none; border-radius: 0; } outli ...

  8. BZOJ 1606 USACO 2008 Dec. 购买干草

    [题意概述] 有n件物品,每件物品有体积Vi,背包容量为C,问最多可以装多少体积的物品 [题解] 显然是个无限背包嘛.. 直接做背包DP就好 注意无限背包的写法和01背包的区别 #include< ...

  9. 5 pandas模块,DataFrame类

              DataFrame       DataFrame是一个[表格型]的数据结构,可以看作是[由Series组成的字典](共用同一个索引).DataFrame由一定顺序排列的多列数据组 ...

  10. java后台处理解析json字符串的两种方式

    简单说一下背景 上次后端通过模拟http请求百度地图接口,得到的是一个json字符串,而我只需要其中的某个key对应的value. 当时我是通过截取字符串取的,后来觉得不太合理,今天整理出了两种处理解 ...