java实现堆排序
2015-06-29 23:52
417 查看
package cn.sort.heap; import cn.sort.utils.ArrayUtils; /** * Created by zzh on 2015/6/21. */ public class HeapSort { public static void main(String[] args) { int[] a = {2,1,5,4,8,6}; System.out.println("before"); ArrayUtils.printArray(a); heapSort(a); System.out.println(); System.out.println("after"); ArrayUtils.printArray(a); } public static void heapSort(int[] arr) { if (arr == null || arr.length <= 1) { return; } //大根堆建立完成 buildMaxHeap(arr); // ArrayUtils.printArray(arr); for (int i = arr.length - 1; i >= 1; i--) { //交换可能破环了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法) ArrayUtils.swap(arr, 0, i); maxHeap(arr, i, 0); } } /** * 建立最大堆 * @param arr */ private static void buildMaxHeap(int arr[]) { if (arr == null || arr.length <= 1) { return; } int half = arr.length / 2; for (int i = half; i >= 0; i--) { maxHeap(arr, arr.length, i); } } /** * 单个节点建立大根堆,递归 * @param arr 数组 * @param heapSize 数组大小 * @param index 节点角标 */ private static void maxHeap(int arr[], int heapSize, int index) { //左子节点 int left = index*2 + 1; //右子节点 int right = index/2 + 2; //最大的 int largest = index; if (left < heapSize && arr[left] > arr[largest]) { largest = left; } if (right < heapSize && arr[right] > arr[largest]) { largest = right; } if (index != largest) { ArrayUtils.swap(arr, index, largest); maxHeap(arr, heapSize, largest); } } }
相关文章推荐
- Java中HashMap和TreeMap的区别深入理解
- [转载] Java集合框架之小结
- java设计模式之工厂模式(工厂方法、抽象工厂)
- 2015062906 - EffactiveJava笔记 - 第46条 foreach优先传统for循环(2)
- Java 1.5新特性Enum的学习和使用
- java复习数组
- web安全框架Spring Security
- Struts2单例引起的问题及解决思考
- JAVA中enum的常见用法
- Java enum的用法详解
- Spring Security 安全框架
- struts2框架学习之国际化资源 (续)
- 2015062905 - EffactiveJava笔记 - 第46条 foreach优先传统for循环(1)
- 《Java程序设计》第16周周五:数据库连接 与 随机数的使用&&《Java课程实习》日志(周一)
- Eclipse中安装vim插件
- 通过字节码分析java中的switch语句
- Spring中 @Autowired标签与 @Resource标签 的区别(转)
- 几种任务调度的 Java 实现方法与比较
- java通信socket实现
- java,swing中setvisible()使用注意事项