1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public static void heapSort(int[] arr) { int temp = 0; // 循环调用,完成整个大顶堆 for (int i = arr.length/2 -1; i>=0; i--) { adjustHeap(arr, i, arr.length); }
// 交换顶端的值和最末端的值,然后排除最后一个值再次堆化处理,交换 for (int j = arr.length-1; j>0; j--) { temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; adjustHeap(arr, 0, j); } }
/** * 完成以i为父节点的局部大顶堆 * i对应的非叶子节点 */ public static void adjustHeap(int[] arr, int i, int length) { int temp = arr[i]; for (int k = 2*i+1; k<length; k = 2*k+1) { if (k+1 < length && arr[k] < arr[k+1]) { // 如果左节点小于右节点,则k指向右节点 k++; } if (arr[k] > temp) { arr[i] = arr[k]; // 如果子节点大于父节点,则赋把子节点的值给到父节点 i = k; // i指向k,再循环去处理 } else { break; } }
arr[i] = temp; }
|