堆排序java版
来源:互联网 发布:coc自动打鱼软件 编辑:程序博客网 时间:2024/06/03 14:52
堆是完全二叉树的结构,并且,节点都比子节点上的值大或者小。这就是对,由此可见,依次输出堆的最顶端元素,就能得到一个有序的序列,那么关键的问题就是如何把一个无序的序列建成一个堆?输出堆最顶端元素后,如何把剩下的元素建成一个堆?
下面看看实现过程:
/** * 堆排序 * @author Administrator * */public class MainClass {public static void main(String[] args) {final int length = 6; // 数组的总长度int sortingLength = length; // 排序过程中,需要调整为堆的剩余无需数组的长度int[] nums = new int[length];Random random = new Random();for (int i = 0; i < nums.length; i++) {nums[i] = random.nextInt(20);}//nums = new int[]{18 ,14 ,12 ,15 ,16 ,10};System.out.println("排序前:");for (int i = 0; i < nums.length; i++) {System.out.print(nums[i] + " ");}System.out.println();// 1、创建堆// 2、交换第一个与最后一个数的位置// 3、重新调整堆, 重复1和2的步骤createHeap(nums, length); // 创建堆for (int i = 0; i < nums.length; i++) {swap(nums, 0, length - i- 1); // 调整第一个与当前无序数组最后一个数的位置adjustHeap(nums, length - i - 1 , 1);}System.out.println("排序后:");for (int i = 0; i < nums.length; i++) {System.out.print(nums[i] + " ");}}/** * 调整堆 * @param size 数组长度 * @param lastParent 要调整的树的父节点 * @param nums 与堆对应的数组 */private static void adjustHeap(int[] nums, int size, int lastParent) {int leftIndex = lastParent * 2 - 1; // 左边子节点位置int rightIndex = lastParent * 2; // 右边子节点位置int maxIndex = lastParent - 1; // 假设三个节点中,左边孩子节点最大System.out.println("adjustHeap lastParent:" + lastParent);System.out.println("adjustHeap leftIndex: " + leftIndex);System.out.println("adjustHeap rightIndex:" + rightIndex);System.out.println("adjustHeap maxIndex:" + maxIndex);if (lastParent <= size / 2) { // 只需要调整有子节点的树if (nums[leftIndex] > nums[maxIndex]) {System.out.println("adjustHeap 左边节点大leftIndex:" + leftIndex);maxIndex = leftIndex;} if (rightIndex <= size - 1 && nums[rightIndex] > nums[maxIndex]) {System.out.println("adjustHeap 右边节点大rightIndex:" + rightIndex);maxIndex = rightIndex;}if (maxIndex != lastParent - 1) { // 交换System.out.println("交换");swap(nums, lastParent - 1, maxIndex);adjustHeap(nums, size, maxIndex + 1);}}}/** * * @param nums 无序数组 * @param size 无序数组大小 */private static void createHeap(int[] nums, int size) {for (int i = size / 2; i >= 1; i--) {System.out.println("createHeap 最后一个parent节点:" + i );adjustHeap(nums, size, i); // 调整堆}}// 交换数组中指定位置的元素private static void swap(int[] nums, int i, int j) {int temp;temp = nums[i];nums[i] = nums[j];nums[j] = temp;/*nums[i] = nums[i] + nums[j];nums[j] = nums[i] - nums[j]; // inums[i] = nums[i] - nums[j];*/}}
1 0
- Java版 堆排序
- 堆排序java版
- java版堆排序
- 堆排序实现java版
- 堆排序(java版)
- 堆排序JAVA版实现
- 堆排序算法(java版)
- 排序算法之堆排序Java版
- 排序之堆排序java版
- java排序 -- 堆排序
- 堆排序详解【java版附流程图】
- 堆排序详解(JAVA版)
- 堆排序详解【java版附流程图】
- Java堆排序算法
- 堆排序(java)
- Java 堆排序算法
- JAVA 堆排序
- 堆排序Java代码
- 安装sakila数据库
- PHP获取IP地址所在的地理位置
- ZStack Monitor and Test(MT)功能简介与Z-tool使用介绍
- git乱码解决方案汇总
- Android Studio安装插件
- 堆排序java版
- php构造函数的继承方法
- View 样式(背景色、圆角、描边、等等)
- 在android中gif的效果和渐变效果
- Spring入门第二个例子
- 224,GCD多线程
- 如何分析解决Android ANR
- hadoop 中 HDFS 由于多次格式化引起的 nanenode 与 datanode 启动异常
- java注解annotation的解释