堆排序 java
来源:互联网 发布:淘宝怎么买砍刀 编辑:程序博客网 时间:2024/06/16 03:03
public class HeapSort { public static void main(String[] args) { int[] arr = { 93, 40, 34, 56, 77, 15, 62, 72, 89 }; System.out.println("排序之前:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); System.out.println("排序前的堆"); printHeapTree(arr); // 堆排序 heapSort(arr); System.out.println("排序后的堆"); printHeapTree(arr); System.out.println("排序之后:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } //堆排序 private static void heapSort(int[] arr) { // 将待排序的序列构建成一个大顶堆 for (int i = arr.length / 2; i >= 0; i--){ heapAdjust(arr, i, arr.length); } // 逐步将每个最大值的根节点与末尾元素交换,并且再调整二叉树,使其成为大顶堆 for (int i = arr.length - 1; i > 0; i--) { swap(arr, 0, i); // 将堆顶记录和当前未经排序子序列的最后一个记录交换 heapAdjust(arr, 0, i); // 交换之后,需要重新检查堆是否符合大顶堆,不符合则要调整 } } /** * 构建堆的过程 * @param arr 需要排序的数组 * @param i 需要构建堆的根节点的序号 * @param n 数组的长度 */ private static void heapAdjust(int[] arr, int i, int n) { int child; int father; for (father = arr[i]; leftChild(i) < n; i = child) { child = leftChild(i); // 如果左子树小于右子树,则需要比较右子树和父节点 if (child != n - 1 && arr[child] < arr[child + 1]) { child++; // 序号增1,指向右子树 } // 如果父节点小于孩子结点,则需要交换 if (father < arr[child]) { arr[i] = arr[child]; } else { break; // 大顶堆结构未被破坏,不需要调整 } } arr[i] = father; } //输出堆 private static void printHeapTree(int[] arr){ for(int i=1;i<arr.length;i=i*2) { for(int k=i-1;k<2*(i)-1&&k<arr.length;k++) { System.out.print(arr[k]+" "); } System.out.println(); } } // 获取到左孩子结点 private static int leftChild(int i) { return 2 * i + 1; } // 交换元素位置 private static void swap(int[] arr, int index1, int index2) { int tmp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = tmp; } }
阅读全文
0 0
- java排序 -- 堆排序
- Java堆排序算法
- 堆排序(java)
- Java 堆排序算法
- JAVA 堆排序
- 堆排序Java代码
- java 堆排序
- 堆排序Java实现
- java堆排序
- 堆排序(JAVA)
- 堆排序-java实现
- JAVA堆排序
- java 堆排序
- 堆排序 Java实现
- 堆排序 java
- java 堆排序
- Java堆排序
- java堆排序
- Logtail技术分享(一) : Polling + Inotify 组合下的日志保序采集方案
- linux C 生成带有格式的文件 wkhtmltopdf(类似word的效果 有颜色 字体等等)
- 欢迎使用CSDN-markdown编辑器
- (N)Telephony分析(五)之DcTracker的初始化
- ajax自动补全
- 堆排序 java
- 针对复制东西Eclipse或者MyEclipse中出现cannot paste the clipboard contents into the selected elements报错问题
- 【微信小程序】把客服按钮替换成自己想要的图片
- 多线程编程学习四(Lock 的使用)
- jquery、js 复制到黏贴板
- 响应式Web设计:Media Queries和Viewport的区别和用法
- 纸牌博弈问题
- Android N (7.0) 数据拨号前的准备工作
- Spring Boot 配置ContextPath