本文共 3022 字,大约阅读时间需要 10 分钟。
对{4,6,8,5,9}进行排序
public static void heapSort(int[] arr) { System.out.println("堆排序"); int temp ; for (int i = arr.length / 2 - 1;i >= 0;i --){ adjustHeap(arr,i,arr.length); } //进行第一次排序,从左往右,从下到上 for (int i = arr.length - 1;i > 0;i --){ temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; //将已经排序过的根结点的最大值,沉入到数组的最低端 adjustHeap(arr,0,i); //然后在不算最后一个节点的情况下,对剩下的在进行有序化整理为大顶堆。 //没有必要从头进行整理,仅仅交换了顶点,所以只要从头开始 } } public static void adjustHeap(int arr[], int i, int length) { int temp = arr[i]; //设置交换值用于整理子树 for (int k = i * 2 + 1; k < length; k = k * 2 + 1) { //从当前左子节点开始,每一次都是在下一层开始 if (k + 1< length && arr[k] < arr[k + 1]){ //如果存在右子节点并且左子节点小于右子节点,那么就直接将k移动到右子节点。 k ++; } if (arr[k] > temp){ arr[i] = arr[k]; i = k; //如果k的值交换过,那就交换 }else{ //如果没有交换,那就直接退出,因为下一层已经排好序了,所以可以以直接退出 break; } } arr[i] = temp; //将交换的值赋给原定的值 }
for(int k = i * 2 + 1;k < arr.length;k = 2 * k +1){ if(k + 1 < length && arr[k] < arr[k + 1]){ k ++; } if(arr[k] > temp){ temp = arr[k] }else{ break } arr[i] = temp;}
if(int i = arr.length / 2 - 1;i >= ;i --){ adjustHeap(arr,i,arr.length) }
for (int i = arr.length / 2 - 1;i > 0;i --){ adjustHeap(arr,i, arr.length); }
adjustHeap(arr,arr.length / 2 - 1, arr.length);
if (arr[k] > temp){ arr[i] = arr[k]; k = i; }else{ break; }
转载地址:http://xqgpb.baihongyu.com/