堆排序:
// 已知 r[low..high]中除 r[low]之外,其余元素均满足堆的定义
private void heapAdjust(int[] r, int low, int high) {
int tmp = r[low];
for (int j = 2 * low; j <= high; j = j * 2) { // 沿关键之较大的元素向下进行筛选
if (j < high && r[j] > r[j + 1])// j 指向关键之较大的元素
j++;
if (tmp >= r[j])// 若 temp 比其孩子都大,则插入到 low 所指位置
break;
r[low] = r[j];
low = j; // 向下筛选
}
r[low] = tmp;
}
public void heapSort(int[] r) {
int n = r.length - 1;
for (int i = n / 2; i >= 1; i--)
// 初始化建堆
heapAdjust(r, i, n);
for (int i = n; i > 1; i--) { // 不断输出堆顶元素并调整 r[1..i-1]为新堆
int tmp = r[1]; // 交换堆顶与堆底元素
r[1] = r[i];
r[i] = tmp;
heapAdjust(r, 1, i - 1); // 调整
}
}