根节点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称为最大堆(大顶堆)。大顶堆要求根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值。
见《数据结构》严魏敏 P279,书上写得真的很不错!搜到的博客都没有书上介绍的详细。
代码如下:
import java.util.Random;
public class Solution {
public int[] sortArray(int[] nums) {
heapSort(nums);
return nums;
}
public void heapSort(int[] nums){
int len = nums.length-1;
buildMaxHeap(nums, len);
for(int i=len; i>=1; --i){
swap(nums, i, 0);
len-=1;
maxHeapify(nums, 0, len);
}
}
public void buildMaxHeap(int[] nums, int len){
for(int i=len/2; i>=0; --i){
maxHeapify(nums, i, len);
}
}
public void maxHeapify(int[] nums, int i, int len){
for(; (i<<1)+1<=len;){
int lson = (i<<1)+1;
int rson = (i<<1)+2;
int large = 0;
if(lson <= len && nums[lson] > nums[i]){
large = lson;
}else{
large = i;
}
if(rson <= len && nums[rson] > nums[large]){
large = rson;
}
if(large != i){
swap(nums, i, large);
i = large;
}else{
break;
}
}
}
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
优点:
1)相对于快排来说,其最大的优点是,在最坏的情况下,其时间复杂度也为O(nlogn)
2)仅需要一个记录大小供交换用的辅助存储空间