diff --git a/src/main/java/git/snippet/heap/LintCode_0130_Heapify.java b/src/main/java/git/snippet/heap/LintCode_0130_Heapify.java index 64d8597392382db2772ca8c4c3ff9af7d2024471..d8408507f263b0dcbd2432612e8a3b42b851abfd 100644 --- a/src/main/java/git/snippet/heap/LintCode_0130_Heapify.java +++ b/src/main/java/git/snippet/heap/LintCode_0130_Heapify.java @@ -6,33 +6,23 @@ package git.snippet.heap; // https://www.lintcode.com/problem/130/ public class LintCode_0130_Heapify { public void heapify(int[] a) { - if (null == a || a.length <= 1) { - return; - } - for (int i = a.length - 1; i >= 0; i--) { - heapify(a, i, a.length); - } - } - - public void heapify(int[] arr, int i, int len) { - int leftChildIndex = 2 * i + 1; - while (leftChildIndex < len) { - int min = - leftChildIndex + 1 < len && arr[leftChildIndex + 1] < arr[leftChildIndex] - ? leftChildIndex + 1 - : leftChildIndex; - min = arr[min] > arr[i] ? i : min; - if (min == i) { - break; + for (int index = a.length - 1; index >= 0; index--) { + int i = index; + int leftChildIndex = 2 * i + 1; + while (leftChildIndex < a.length) { + int minIndex = leftChildIndex + 1 < a.length && a[leftChildIndex] > a[leftChildIndex + 1] ? leftChildIndex + 1 : leftChildIndex; + minIndex = a[i] < a[minIndex] ? i : minIndex; + if (minIndex == i) { + break; + } + swap(a, i, minIndex); + i = minIndex; + leftChildIndex = 2 * i + 1; } - swap(arr, min, i); - i = min; - leftChildIndex = 2 * min + 1; } } - public void swap(int[] arr, int i, int j) { - if (i != j) { + if (i != j && arr != null && arr.length > 1) { arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; diff --git a/src/main/java/git/snippet/heap/MaxHeap.java b/src/main/java/git/snippet/heap/MaxHeap.java index cf6014d2ea97473d7295d752f81b6f8c4c97c711..77200b64d3075961a8b6c30ccb1665c119ab54f3 100644 --- a/src/main/java/git/snippet/heap/MaxHeap.java +++ b/src/main/java/git/snippet/heap/MaxHeap.java @@ -22,12 +22,10 @@ package git.snippet.heap; // heapify和heapInsert都是logN级别的复杂度,因为N个节点的二叉树高度是logN public class MaxHeap { private final int[] heap; - // private final int limit; limit == heap.length private int heapSize; public MaxHeap(int limit) { heap = new int[limit]; - // this.limit = limit; heapSize = 0; }