算法步骤
动图演示
复杂度
时间复杂度 = Ο(nlogn) 空间复杂度 = O(1)
代码实现
public static void sort1(int[] arr) {
int len = arr.length;
int step = 0;
// (n-1)()
while (step < len - 1) {
//最高位保存最大值,要递减
int maxNum = len - step;
//堆顶点的个数
int num = (int) ((maxNum - 1) / 2.0 + 0.5);
if (num < 1) num = 1;
for (int i = num; i >= 1; i--) {
int x = i - 1;
int y = 2 * i - 1;
int z = 2 * i > maxNum - 1? - 1:2 * i;
int max = y;
if (z > 0 && arr[z] > arr[y]) {
max = z;
}
if (arr[max] > arr[x]) {
RandomUtils.swap(arr,x,max);
}
}
RandomUtils.swap(arr,0,maxNum - 1);
step++;
}
}