题目
代码
堆排序(升序用大根堆,降序用小根堆):
class Solution {
public int[] sortArray(int[] nums) {
// Arrays.sort(nums);
// return nums;
int temp = 0;
for (int i = nums.length / 2 - 1; i >= 0; i--) {
adjustHeap(nums, i,nums.length);
}
for (int j = nums.length - 1; j > 0; j--) {
temp = nums[j];
nums[j] = nums[0];
nums[0] = temp;
adjustHeap(nums, 0, j);
}
return nums;
}
private void adjustHeap(int[] nums, int i, int len) {
int temp = nums[i];
for (int k = i * 2 + 1; k < len; k = k * 2 + 1){
// 这个地方是判断节点i的左右子树节点哪个节点值最大,k就指向哪个
if (k + 1 < len && nums[k] < nums[k + 1])
k++;
if (nums[k] > temp) {
nums[i] = nums[k];
i = k;
} else {
break;
}
}
nums[i] = temp;
}
}