步骤:
- 构建大根堆,父节点大于右孩子大于左孩子
- 首尾交换然后排序
代码
void heap(int[] arr) {
int n = arr.length;
int t;
// 将数组转变成堆
for (int i = n / 2 - 1; i >= 0; i--) {
// 如果第i个节点有右孩子,那么n为 单数,n/2向下取整后,再反向计算,肯定是小于n的;
while (2 * i + 1 < n) {
int j = 2 * i + 1;
if (j + 1 < n) { //如果有右孩子
if (arr[j] < arr[j + 1]) {
j++;
}
}
if (arr[i] < arr[j]) {
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i = j;
} else {
break;
}
}
}
int k;
// 开始堆排序
for (int a = n - 1; a > 0; a--) {
// 首尾交换
t = arr[0];
arr[0] = arr[a];
arr[a] = t;
k = 0;
while (2 * k + 1 < a) {
int j = 2 * k + 1;
if ((j + 1) < a) {
if (arr[j] < arr[j + 1]) {
j++;
}
}
if (arr[k] < arr[j]) {
t = arr[k];
arr[k] = arr[j];
arr[j] = t;
k = j;
} else {
break;
}
}
}
}