堆排序的java实现
2016-03-04 09:57
603 查看
在堆排序的java实现中,待排序的数组arr[0]是空出来不使用的,因为java数组的下标是从0开始的,而堆的起始下标为1(保证满足父节点与左右节点的算数关系)。因此arr[1],arr[2]...ar[arr.length - 1]是被排序的元素集合。
在堆排序算法中,每次将堆的最后一个元素与堆顶元素(当前堆最大元素)进行交换,然后将堆大小heapSize减1,再对根节点进行最大堆的维护,依次类推。这里要注意的是数组的大小是不变的,而堆的大小是变化的,不能简单地认为heapSize=arr.length - 1.正因为此,在最大堆的维护算法和建堆算法中要传入堆大小这个参数。
在堆排序算法中,每次将堆的最后一个元素与堆顶元素(当前堆最大元素)进行交换,然后将堆大小heapSize减1,再对根节点进行最大堆的维护,依次类推。这里要注意的是数组的大小是不变的,而堆的大小是变化的,不能简单地认为heapSize=arr.length - 1.正因为此,在最大堆的维护算法和建堆算法中要传入堆大小这个参数。
package mec.lanqiao; import java.util.Arrays; public class Main { static int left(int i) { return i * 2; } static int right(int i) { return i * 2 + 1; } static int parent(int i) { return i / 2; } static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } // 维护最大堆性质,假定以left(i),right(i)为根的二叉树都是最大堆 static void maxHeapify(int[] arr, int i, int heapSize) { int l = left(i); int r = right(i); int largest = i; if (l <= heapSize && arr[l] > arr[largest]) largest = l; if (r <= heapSize && arr[r] > arr[largest]) largest = r; if (largest != i) { swap(arr, i, largest); maxHeapify(arr, largest, heapSize); } } // 建堆 static void buildMaxHeap(int[] arr) { int heapSize = arr.length - 1; for (int i = (arr.length - 1) / 2; i > 0; i--) { maxHeapify(arr, i, heapSize); } } // 堆排序 static void heapSort(int[] arr, int heapSize) { buildMaxHeap(arr); for (int i = arr.length - 1; i > 1; i--) { swap(arr, 1, i); heapSize--; maxHeapify(arr, 1, heapSize); } } public static void main(String[] args) { int[] arr = { 0, 7, 16, 10, 8, 14, 9, 3, 2, 1, 4 }; // maxHeapify(arr, 1, 10); // [16, 14, 10, 8, 7, 9, 3, 2, 4, 1] heapSort(arr, arr.length - 1); System.out.println(Arrays.toString(arr)); } }
相关文章推荐
- IT十八掌作业_java基础第二天_进制转换原理和补码存储方式
- Java多态例题
- 【leetcode】【91】Decode Ways
- Java关于排序的介绍3-高级排序
- Javassist简单应用小结
- JAVA CAS原理深度分析
- eclipse EasyExplore插件安装
- Spring Bean 生命周期2
- Eclipse配置信息
- JavaBean
- java中dynamic web project与web project 的区别
- 深入分析Java ClassLoader原理
- 简单模拟spring装载注入bean原理
- 【Javaweb】Eclipse for JavaEE新建的Web工程自动生成web.xml
- Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决
- Pojo和JavaBean的区别
- Java运算符
- JNI中C调用Java方法
- LintCode 最大数