堆排序 java
来源:互联网 发布:淘宝代销货源平台 编辑:程序博客网 时间:2024/06/06 03:02
对于下面的二叉树进行堆排序
/** a* / \* b c* /\ / \* d e f g***/
1 。 首先我们先把c 与 f , g 进行比对,如果c> f 且 c>g 进入 操作2 , 如果 c<f 或 c<g 我们将 c与最大的那个节点进行交换 (我们的目的是把二叉树中最大的数移动到跟节点)
2 。 对于b 进行操作1
3 。 对a 进行操作1 ( 这样最大的数被移动到跟节点) , 将这个最大数 与二叉树最后的一个数字进行交换 , 二叉树的尺寸减少1 , 对除了最后节点外的二叉树重复前面的操作
让我们来举个 栗子
/** 4* / \* 2 10* /\ / \* 6 7 1 20***/
进行第一步 对10进行判断,得到下面的堆
/** 4* / \* 2 20* /\ / \* 6 7 1 10***/
<pre name="code" class="java">/** 4* / \* 7 20* /\ / \* 6 2 1 10***/
对 4 进行判断
/** 20* / \* 7 4* /\ / \* 6 2 1 10***/
这个时候我们得到当前堆的最大值20 将它与最末的节点交换
/** 10* / \* 7 4* /\ / \* 6 2 1 20***/
接下来我们查看除了 20节点的其他的堆,同样,因为4不是最下层节点,从4开始判断,因为4大于1(不考虑20)所以不变。
查看7节点,7节点大于2和6,所以不变。
查看10节点,同样 10节点不变。
将10与1交换(与最后的节点交换)得到下图
/** 1* / \* 7 4* /\ / \* 6 2 10 20***/
然后从7开始查看 , 对于剩下的堆我们还有5个元素要查看,而从那个节点开始查看 我是用 节点数 / 2 得到的值开始查看。
对于这个堆剩下 1,7,4,6,2. 那个用5 / 2 得到2 所以从第二个节点开始查看。
对于7来说,不用变。
继续查看1节点得到下图
/** 7* / \* 1 4* /\ / \* 6 2 10 20***/
接下来 交换7 与 2
/** 2* / \* 1 4* /\ / \* 6 7 10 20***/
剩下4个节点 4 / 2 = 2 所以从1 开始查看
用1 与6 交换
/** 2* / \* 6 4* /\ / \* 1 7 10 20***/
查看2 节点 将 2与 6 交换
/** 6* / \* 2 4* /\ / \* 1 7 10 20***/
6与最后节点交换
/** 1* / \* 2 4* /\ / \* 6 7 10 20***/
这个时候我们还剩下3个节点,3 / 2 = 1 所以查看第一个节点,也就是1 得到下图
/** 4* / \* 2 1* /\ / \* 6 7 10 20***/
将4与 最后节点交换 得到下图
/** 1* / \* 2 4* /\ / \* 6 7 10 20***/
查看1节点 得到下图
/** 2* / \* 1 4* /\ / \* 6 7 10 20***/
然后交换
/** 1* / \* 2 4* /\ / \* 6 7 10 20***/
这个时候还有最后一个元素, 1 / 2 = 0 所以算法结束 下面是java 代码
/** * * @author rq * */public class Heap {static int[] arr={0,13,65,5,97,25,7,37,22,2,4,28}; // bottom-up heap algorithmstatic int size;public Heap(int size){int address = size/2;createTree(address);}public class Node{Node node;Node left;Node right;int value;public void node(int value){this.value=value;}}public void createTree(int address){if(address>0){if(2*address+1<=size){exchangeValue(2*address,2*address+1,address);}else{exchangeValue(2*address,2*address,address);}createTree(address-1);}bottomupHeap(size);}public void exchangeValue(int left,int right, int node){int c;if(arr[left]>=arr[right]){c=left;}else{c=right;}if(arr[c]>arr[node]){int exValue=arr[c];arr[c]=arr[node];arr[node]=exValue;}}public void bottomupHeap(int l){if(l>1){int exValue=arr[1];arr[1]=arr[l];arr[l]=exValue;size=l-1;int address=size/2;createTree(address);}}/** * 13 * / \ * 65 5 * / \ / \ * 97 25 7 37 * / \ / \ * 22 2 4 28 */ public static void main(String[] args) { size=arr.length-1; new Heap(size); for(int i=1;i<=arr.length-1;i++){ System.out.print(arr[i]+" "); } }}
转载请注明 谢谢
- java排序 -- 堆排序
- Java堆排序算法
- 堆排序(java)
- Java 堆排序算法
- JAVA 堆排序
- 堆排序Java代码
- java 堆排序
- 堆排序Java实现
- java堆排序
- 堆排序(JAVA)
- 堆排序-java实现
- JAVA堆排序
- java 堆排序
- 堆排序 Java实现
- 堆排序 java
- java 堆排序
- Java堆排序
- java堆排序
- Android merge优化UI
- 多渠道打包资源
- 基于AssetBundle的客户端资源
- Android对Bitmap的内存优化
- Git 教程(二) git 的基本构成及原理
- 堆排序 java
- HDU 1754 I Hate It
- js插件使用整理
- HDU-1069-DP-Monkey and Banana
- 解决win7没有找到suite objects.dll 因此rational rose不能能启动
- programming-challenges Bee Maja (111204) 题解
- 把JavaEE编写的servlet,配置到tomcat7.0
- programming-challenges Dermuba Triangle (111207) 题解
- MySql学习笔记_04_单独说下日期和时间类型&&枚举类型