2012/3/28----堆排序

news/2024/7/3 3:40:35

堆排序是一种基于二叉树的排序,利用二叉树的性质进行排序的算法。但是这里的二叉树并不是真实存在的,是我们利用数组的编号进行设计的特殊的二叉树。

而堆排序其本质是一个就地排序算法。

Java代码 复制代码  收藏代码
  1. /*  
  2.  * 堆排序算法  
  3.  * @version 1.0 2012/3/28  
  4.  * @author akon  
  5.  */  
  6. package com.akon405.www;   
  7.   
  8. public class HeapSort {   
  9.     /*  
  10.      * createMaxHeap的功能:  
  11.      * 创建最大堆  
  12.      */  
  13.     public void createMaxHeap(int[] A,int length){   
  14.         int j;//最后一个非叶子节点          
  15.         for(j=length/2-1;j>=0;j--){   
  16.             heapAdjust(A,j,length);//依次遍历每个非叶结点,然后做出调整   
  17.         }   
  18.     }   
  19.     /*  
  20.      * heapAdjust的功能:  
  21.      * 进行堆的调整,使它始终是最大堆  
  22.      */  
  23.     public void heapAdjust(int[] A,int i,int length){   
  24.         int l,r,temp;   
  25.         l=i*2+1;//非叶节点的左子节点   
  26.         r=i*2+2;//非叶节点的右子节点   
  27.   
  28.         int largest=i;//比较当前节点和子节点的大小的标志   
  29.            
  30.         while(l<length||r<length){   
  31.             if(l<length&&r<length){   
  32.                 //当左右子节点都存在的时候   
  33.                 if(A[i]<A[l]&&A[r]<A[l]){   
  34.                     largest=l;   
  35.                 }   
  36.                 if(A[i]<A[r]&&A[r]>A[l]){   
  37.                     largest=r;   
  38.                 }   
  39.             }else if(l<length&&r>=length){   
  40.                 //只有左子节点,没有右子节点   
  41.                 if(A[i]<A[l]){   
  42.                     largest=l;   
  43.                 }   
  44.             }   
  45.         if(largest!=i){   
  46.             temp=A[i];   
  47.             A[i]=A[largest];   
  48.             A[largest]=temp;   
  49.                
  50.             i=largest;   
  51.             l=i*2+1;   
  52.             r=i*2+2;   
  53.         }else{   
  54.             break;   
  55.         }   
  56.         }   
  57.     }   
  58.     /*  
  59.      * HeapSort的功能:  
  60.      * 进行堆排序  
  61.      */  
  62.     public  HeapSort(int[] A,int length){   
  63.            
  64.         int temp;   
  65.         createMaxHeap(A,length);//创建最大堆   
  66.         System.out.print("最大堆:");   
  67.         for(int i=0;i<A.length;i++){   
  68.             System.out.print(A[i]+",");//输出我们第一次创建的最大堆(主要是用来调试程序)   
  69.             }   
  70.         while(length>1){   
  71.             temp=A[length-1];   
  72.             A[length-1]=A[0];   
  73.             A[0]=temp;   
  74.             length--; //把最大的数值放到数组末尾,然后再把堆进行整理,让剩余的数值继续构成一个最大堆   
  75.             heapAdjust(A,0,length);   
  76.         }   
  77.         System.out.println("");   
  78.         System.out.print("排序结果:");   
  79.         for(int i=0;i<A.length;i++)   
  80.             System.out.print(A[i]+",");   
  81.     }   
  82.     /**  
  83.      * @param args  
  84.      */  
  85.     public static void main(String[] args) {   
  86.         // TODO Auto-generated method stub   
  87.         int[] A={40,10,32,8,78,98,20,3,1};   
  88.         int length=A.length;   
  89.         new HeapSort(A,length);   
  90.     }   
  91. }  

http://www.niftyadmin.cn/n/2572975.html

相关文章

[转帖]Prometheus+Grafana监控Kubernetes

原博客的位置: https://blog.csdn.net/shenhonglei1234/article/details/80503353 感谢原作者 这里记录一下自己试验过程中遇到的问题: 1. 自己查看prometheus 里面的配置文件时 对mount的路径理解不清晰,以为是需要宿主机里面需要有目录才可以, 实际上不需要. 是k8s 将证书和t…

省时省力小技巧教你图片怎么转文字?

现在的这个时代是一个现代化的社会&#xff0c;越来越多省时省力的生活方式或工作学习的小技巧出现。大家知道为什么“懒人”是生活的最惬意的一种人吗&#xff1f;因为他们不喜欢付出很多的力气&#xff0c;于是他们就想方设法研究出了很多的省时省力的小技巧。今天小编带领大…

2012/3/29----快速排序

前面用到了分治算法所演变出来的一种排序---归并排序。这里&#xff0c;我们介绍另一种分治算法演变出来的排序算法---快速排序。 快速排序通过选取数组中的关键字&#xff0c;把一个A[n]数组划分为3部分&#xff1a;A[key]关键字&#xff0c;A[0...key-1]{比关键字小的元素}&…

【luogu P2146 [NOI2015]软件包管理器】 题解

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P2146 变量名真毒瘤 我真的再也不把l&#xff0c;left&#xff0c;r&#xff0c;right弄反了 反向思维更好做一些 #include <cstdio> #include <cstring> #include <iostream> #include <algo…

html to openxml

为什么80%的码农都做不了架构师&#xff1f;>>> Html to OpenXml How to start ? Create a new console application. Add a reference to DocumentFormat.OpenXml.dll (shipped with the OpenXml SDK 2.0). Add an html file and fill it with: <!DOCTYPE H…

AI(Adobe Illustrator)简单入门——小熊

成果&#xff1a; AI里ctrlz撤销&#xff0c;恢复是ctrlshiftz。 主要是使用Blob笔刷和橡皮擦工具来做。 一、选择Blog笔刷&#xff0c;选择小熊的颜色。 二、画小熊的头和身子和前脚掌 按住左中括号和右中括号可以调整笔刷的大小。 三、画后两只熊掌 按住shift键并向右上和左上…

2012/3/30----冒泡排序

冒泡排序的核心思想&#xff1a;把数组中的相邻两个数进行比较&#xff0c;然后把较大的数向后移&#xff0c;一直到最后的一个数是整个数组中最大的数。再把前面的过程循环&#xff0c;就可以完成排序。 Java代码package com.akon405.www; public class BubbleSort { …

(深搜)棋盘问题 -- poj -- 1321

链接&#xff1a; http://poj.org/problem?id1321 Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 28899 Accepted: 14307Description 在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两…