堆排序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
原创粉丝点击