/**
* Copyright (C), 2018-2019, LMaWC
* FileName: minHeap
* Author: neo
* Date: 2019/7/27 9:12
* Description: 最小堆的构建
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.com.heap;
import java.awt.*;
/**
* 〈一句话功能简述〉<br>
* 〈最小堆的构建〉
*
* @author neo
* @create 2019/7/27
* @since 1.0.0
*/
public class minHeap {
public static void main(String[] args) {
int[] nums = {26,2,761,77,77,1,8,1,9,443,278,2,2,8,2,2811218,2};
// 给数组降序排序就可以直到对还是错了
// 先构建初始化堆
heapInit(nums);
int len = nums.length;
for(int x = len -1;x>=0;x--){
// 最小的元素放到末尾
swap(nums,0,x);
// 重新构建最小堆
heapAdjust(nums,0,x);
}
for(int num:nums){
System.out.println(num);
}
}
public static void heapInit(int[] nums){
int len = nums.length;
for(int d = len/2;d>=0;d--){
heapAdjust(nums,d,len);
}
}
public static void heapAdjust(int[] nums,int i,int len){
// 递归结束条件
// 左右子节点
int leftNo = 2*i+1;
int rightNo = 2*i+2;
// 记录以这三个节点为最小堆的最小值的索引位置
int min=i; // 默认为父节点i
if(leftNo<len&&nums[leftNo]<nums[min]){
min = leftNo;
}
if(rightNo<len&& nums[rightNo]<nums[min]){
min =rightNo;
}
// 说明改变了
if(min !=i){
swap(nums,min,i);
// 递归纵深
heapAdjust(nums,min,len);
}
}
public static void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}