Java实现二叉堆创建
2015-07-05 20:09
1011 查看
问题描述
二叉堆数据结构可以是一个数组对象,他可以视为一个几乎完全的二叉树,最大堆满足对于每一个非根节点,节点的值不大于其父节点的值。程序实现
public class MaxHeap { public static int left(int i){ return 2*i; } public static int right(int i){ return 2*i+1; } public static int heapSize(int [] arr){ return arr.length; } //维护最大堆性质,考虑一个有两个节点的树 public static void maxHeapify(int [] arr,int i){ int l = left(i); int r = right(i); int largest = i; int tmp = -1; //如果左孩子大于根节点,则调换 if(l <= heapSize(arr)&&arr[l-1]>arr[i-1]) largest = l; //如果有孩子大于当前最大的节点,即子节点和根节点,则调换 if(r <= heapSize(arr)&&arr[r-1]>arr[largest-1]) largest = r; //实际调换程序 if(largest != i){ tmp = arr[i-1]; arr[i-1] = arr[largest-1]; arr[largest-1]= tmp; maxHeapify(arr,largest); } } //自底向上建立最大堆,由于下标大于2*i+1的节点没有子节点,从2*i开始逐渐建立最大堆 public static void buildMaxHeap(int[] arr){ for(int i=heapSize(arr)/2;i>0;i--){ maxHeapify(arr,i); } } public static void main(String []args){ int [] innerArr = {4,1,3,2,16,9,10,14,8,7}; buildMaxHeap(innerArr); for(int e:innerArr){ System.out.println(e); } } }
运行时间
T(n) = O(nlgn)更精确地可以再O(n)时间内将一个数组创建为一个堆。
执行结果
1614
10
8
7
9
3
2
4
1
相关文章推荐
- 修改Java程序的进程名
- java异常常见问题汇总
- springmvc+hibernate中几个常用的注解
- java设计模式——观察者模式
- 2015070506 - EffactiveJava笔记 - 第65条 不要忽略异常
- Java 常用排序算法实现
- Java面向对象的理解3
- 使用java进行视频文件拼接
- 2015070505 - EffactiveJava笔记 - 第64条 努力保持失败原子性
- Java 异常处理:finally,return
- Eclipse在线安装SVN
- java中为什么要使用接口?
- Java之内部类
- java模板方法模式
- 【java】单例模式涉及的多线程问题
- 谈谈你对流行框架的理解(
- Ubuntu运行myeclipse××××.run文件失效!!!
- CXF整合Spring配置文件
- Java初级笔记_IO流_2
- 转!!java中的内部类总结