最大堆
堆的插入、堆的删除、原地成堆
堆的上浮
将堆最后一个元素上浮
void upAdjust(int[] nums){
int childIdx = nums.length-1;
int parentIdx = (childIdx-1)/2;
int val = nums[childIdx];
while( childIdx>0 && val>nums[parentIdx]){
nums[childIdx] = nums[parentIdx];
childIdx = parentIdx;
parentIdx = (parentIdx-1)/2;
}
nums[childIdx] = val;
}
堆的插入等价于把新元素放入最大堆数组末尾,然后上浮
堆的下沉
将堆某一个元素下沉
void downAdjust(int[] nums,int parentIdx,int length){
int val = nums[parentIdx];
int childIdx = parentIdx*2+1;
while(childIdx<length){
if( childIdx+1<length && nums[childIdx]<nums[childIdx+1] ){
childIdx++;
}
if(val >= nums[childIdx]){
break;
}
nums[parentIdx] = nums[childIdx];
parentIdx = childIdx;
childIdx = parentIdx*2+1;
}
nums[parentIdx] = val;
}
堆的删除等价于将堆顶元素置换为最大堆数组末尾的元素,然后对堆顶进行下沉操作
构建堆
void heap(int[] nums){
int parentIdx = nums.length/2-1;
while(parentIdx>=0){
downAdjust(nums,parentIdx,nums.length);
parentIdx--;
}
}
将无序堆的所有非叶子节点自后向前依次执行下沉操作
堆排序
以升序排列为例,堆排序的流程:
- 构建最大堆
- 不断把最大堆的头顶删除,挪到队列尾
void heapSort(int[] nums){
heap(nums);
for(int i=nums.length-1;i>0;i--){
int temp = nums[0];
nums[0] = nums[i];
nums[i] = temp;
downAdjust(nums,0,i);
}
}