- 对序列进行原地建堆(heapify)
- 重复执行以下操作,直到堆的元素数量为1
(交换堆顶元素与尾元素,对的元素数量减1,对0位置进行1次siftDown操作)
- 最好、最坏、平均时间复杂度O(nlogn),空间复杂度:O(1),属于不稳定排序
public int[] sort(int[] nums) {
for (int i = nums.length >> 1 - 1; i >= 0; i--) {
adjust(nums, nums.length, i);
}
for(int end = nums.length - 1; end > 0; end--) {
swap(nums[0], nums[end]);
adjust(nums, end, 0);
}
return nums;
}
private void adjust(int[] nums, int len, int index) {
int left = index << 1 + 1;
int right = left + 1;
int maxIdx = index;
if(left < len && nums[left] > nums[maxIdx]) maxIdx = left;
if(right < len && nums[right] > nums[maxIdx]) maxIdx = right;
if(maxIdx != index) {
swap(nums[maxIdx], nums[index]);
adjust(nums, len, maxIdx);
}
}