思路
- 把数组构造成一个大(或小)顶堆,最大(或最小)的值在最上面
- 然后把堆顶和末尾元素交换,这样,最后一个元素就成了最大的(或最小的)
- 然后对剩下的length-1个数再进行构建大顶堆,然后再交换,以此类推,直到剩下最后一个元素,则所有元素均排序完毕
Code
public class HeapSort {
public void sort(int[] arr) {
if (ArrayUtils.isEmpty(arr) || arr.length == 1) {
return;
}
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
for (int j = arr.length - 1; j > 0; j--) {
swap(arr, 0, j);
adjustHeap(arr, 0, j);
}
}
private void adjustHeap(int[] arr, int i, int length) {
for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
if (k + 1 < length && arr[k] < arr[k + 1]) {
k++;
}
if (arr[i] < arr[k]) {
swap(arr, i, k);
i = k;
} else {
break;
}
}
}
private void swap(int[] arr, int index, int target) {
int temp = arr[index];
arr[index] = arr[target];
arr[target] = temp;
}
}
|