public class HeapSort { public static void main(String[] args) { int[] arr = new int[]{5, 4, 9, 8, 7, 6, 0, 1, 3, 2}; /* * 堆排序必须要先把数组变成堆结构,这样收尾交换后,只有头结点不符合堆结构,调整头结点和交换后的那个子节点树即可 * 这里由最后一个非叶子节点向上排 */ for (int i = (arr.length - 1) / 2; i >= 0; i--) { buildHeap(arr, i, arr.length); } for (int i = arr.length - 1; i > 0; i--) { int temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; buildHeap(arr, 0, i); } System.out.println(Arrays.toString(arr)); } private static void buildHeap(int[] arr, int i, int length) { /* * 第i节点,左节点是 2i + 1, 右节点是 2i + 2; * 这里用遍历代替网上常见的递归 */ int max = i; for (; i < length; i = max) { int left = 2 * i + 1; int right = 2 * i + 2; if (left < length && arr[left] > arr[max]) { max = left; } if (right < length && arr[right] > arr[max]) { max = right; } if (max != i) { int temp = arr[max]; arr[max] = arr[i]; arr[i] = temp; } else { break; } } } }
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布