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 37 38 39 40 41 42 43 44 45 46 47 48
| import java.util.*;
class Program { public static int[] heapSort(int[] array) { buildMaxHeap(array); int endIdx = array.length - 1; while (endIdx > 0) { siftDown(array, 0, endIdx); swap(array, 0, endIdx); endIdx -= 1; } return array; }
public static int[] buildMaxHeap(int[] array) { if (array.length == 0) return array; int firstParentIdx = (array.length - 2) / 2; for (int i = firstParentIdx; i >= 0; i--) { siftDown(array, i, array.length - 1); } return array; }
public static void siftDown(int[] array, int currentIdx, int endIdx) { int leftChildIdx = currentIdx * 2 + 1; while (leftChildIdx <= endIdx) { int rightChildIdx = leftChildIdx + 1; int idxToSwap = leftChildIdx; if (rightChildIdx <= endIdx && array[rightChildIdx] > array[leftChildIdx]) { idxToSwap = rightChildIdx; } if (array[idxToSwap] > array[currentIdx]) { swap(array, idxToSwap, currentIdx); currentIdx = idxToSwap; leftChildIdx = currentIdx * 2 + 1; } else { return; } } }
public static void swap(int[] array, int idx1, int idx2) { int tmp = array[idx1]; array[idx1] = array[idx2]; array[idx2] = tmp; } }
|