1. package heap;
  2. import java.math.BigInteger;
  3. /**
  4. * 最大堆最小堆性质:
  5. * 完全二叉树
  6. * left=2i;
  7. * right=2i+1;
  8. * 最大堆:除根节点外,子节点<父节点
  9. * 最小堆:除根节点外,子节点>父节点
  10. * 堆排序算法复杂度:o(n*lgn)
  11. *
  12. * @author B.Chen
  13. *
  14. */
  15. public class MaxHeap {
  16. public int heapSize;
  17. public int parent(int i) {
  18. return i / 2;
  19. }
  20. public int left(int i) {
  21. return 2 * i;
  22. }
  23. public int right(int i) {
  24. return 2 * i + 1;
  25. }
  26. public void maxHeapify(int[] a, int i) {
  27. int l = left(i);
  28. int r = right(i);
  29. int largest = i;
  30. if (l < heapSize) {
  31. if (a[l] > a[i]) {
  32. largest = l;
  33. }
  34. }
  35. if (r < heapSize) {
  36. if (a[r] > a[largest]) {
  37. largest = r;
  38. }
  39. }
  40. if (largest != i) {
  41. int temp = a[i];
  42. a[i] = a[largest];
  43. a[largest] = temp;
  44. maxHeapify(a, largest);
  45. }
  46. }
  47. public void builtMaxHeap(int[] a) {
  48. heapSize = a.length;
  49. for (int i = (a.length - 1) / 2; i >= 0; i--) {
  50. maxHeapify(a, i);
  51. }
  52. }
  53. public void heapSort(int[] a) {
  54. builtMaxHeap(a);
  55. for (int i = a.length - 1; i > 0; i--) {
  56. int temp = a[0];
  57. a[0] = a[i];
  58. a[i] = temp;
  59. heapSize = heapSize - 1;
  60. maxHeapify(a, 0);
  61. }
  62. }
  63. public static void main(String[] args) {
  64. MaxHeap mh = new MaxHeap();
  65. int[] a = new int[] { 7, 6, 4, 2, 8, 3, 1, 5, 9, 0 };
  66. mh.heapSort(a);
  67. for (int i = 0; i < a.length; i++) {
  68. System.out.print(a[i] + " ");
  69. }
  70. }
  71. }
  72. 其中2×i可以用二进制表示成i<<1
    2×i+1可以表示成(i<<1)+1

转载于:https://www.cnblogs.com/xinzhuangzi/archive/2010/05/16/4100618.html

堆排序(利用最大堆)相关推荐

  1. 【算法学习】堆排序建立最大堆

    本文代码均转自: 作者:早就戒了 来源:CSDN 原文:https://blog.csdn.net/qq_37169817/article/details/79777264 版权声明:本文为博主原创文 ...

  2. 排序算法(6)堆排序

    排序算法(6)堆排序---选择排序的高级版 思想:利用数据结构堆的思想来排序,堆排序利用了大堆(或小堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键最大(或最小)的记录变得简单 ...

  3. 【算法实践】他山之石, 可以攻玉 -- 利用完全二叉树快速实现堆排序

    前言 什么是堆 堆是一种数据结构,它是完全二叉树或者是近似完全二叉树的一种数据结构,树中每个结点的值都不小于(或不大于)其左右孩子结点的值. 何为完全二叉树 完全二叉树是一种特殊的二叉树,完全二叉树是 ...

  4. 算法导论笔记:06堆排序

    满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点(也可以这样理解,除叶子节点外的所有结点均有两个子结点.节点数达到最大值.所有叶子结点必须在同一层上) 1:堆排序的时间复杂度为O( ...

  5. PAT1098【插入排序+堆排序】

    简单插入排序: 简单插入排序的核心思想: 把一条这么个难看的序列默认分为两个排好序的和未排好序的两个部分: 所以一开始排好序的只有一个a[0](好看的只有一个),难看的有N(数组长度)-1个a[1,n ...

  6. python堆排序算法_python 排序 堆排序

    算法思想 : 堆排序利用堆数据结构设计的一种排序算法,堆是一种近似完全二叉树的结构,同时满足堆积的性质,即对于任意的i均有ki>=k(2i+1),ki>=k(2i+2) 步骤: 将数组转化 ...

  7. 算法熟记-排序系列-堆排序

    1. 简述 假设待排序数组为 int array[], 数组长度为n.     主要是利用堆的性质.对于升序排序,使用最大堆.     首先,建堆,使用递归后根序遍历得方法,通过交换元素,保证根元素比 ...

  8. 算法学习(三)堆排序

    要弄清楚堆排序,我们首先要懂得以下两点: 1)逻辑上的结构,怎么样才是一个堆. 2)存储上的结构,一个堆存储起来的结构是怎么样的. 一般来讲,堆排序中的"堆"指的是二叉堆,一种完全 ...

  9. 堆排序基础讲解(代码+注释)

    首先,推荐一下<算法导论>的第六章---堆排序,在网上找了很多资料,发现还是这本圣经最给力.大家学堆排序一定要去看看,不然是一种浪费.如果大家没有,可以去网上下载英文版(chm版)的,既清 ...

最新文章

  1. python中的EVAL函数的定义和用法!
  2. 【IntelliJ IDEA】创建 导入 Java 项目
  3. 【教程】如何在标签打印工具TFORMer Designer中自定义布局?
  4. java 基础知识面试题(持续更新),java基础面试笔试题
  5. xadmin与admin设置
  6. 后渗透篇:清理windows入侵痕迹总结【详细】
  7. 2021年全球及中国区块链投融资及技术专利情况:中国区块链相关注册企业达到9.36万余家,新增专利15985项 [图]
  8. 2021年6月程序员薪资出炉,平均薪资15302元
  9. SAP-MM-PA精解分析系列之供应商(02)-账户组解析
  10. 使用ppt将输入的文字导出png
  11. 整理一些即使通讯的测试点
  12. 快门光圈感光度口诀_一张图教你看懂相机光圈、快门、感光度!太神了!
  13. 安装Kylin Linux Advanced Server V10操作系统
  14. Matlab实现蒙特卡罗方法(随机模拟法)
  15. 内网ssl证书颁发_使用SSL和开放源证书颁发机构消除垃圾邮件
  16. 数据库应用——MyCat代理MySQL集群
  17. 使用电子签章确立在线医疗电子病历的法律地位
  18. TCP与UDP协议,socket套接字编程,通信相关操作
  19. Android+CS6:工业动画之变速变方向旋转齿轮
  20. 关于typedef的用法

热门文章

  1. 并联匹配和串联匹配的原理和选择
  2. NTRIP/ SUPL
  3. ansible的安装和ansible的模板
  4. 平板电脑安装软件_分享一个将平板作为电脑分屏的软件(文末有链接)
  5. php++mpdf.mpdf,使用php第三方包mpdf将网页装换成pdf文件【2】
  6. 前沿分享|阿里云数据库高级技术专家 宋利兵:阿里云企业级自治数据库RDS详解
  7. 阿里云混合云Apsara Stack 2.0发布,加速政企数智创新
  8. 5天让你技能加满的“王炸组合”,速来!
  9. 开放下载!《阿里云存储白皮书》全面解读阿里云存储二十年的技术演进
  10. 免费下载!《九年双11:互联网技术超级工程》,300页干货精华