数组实现最小堆
假设堆中节点从下标0开始,那么从最后一个非叶子节点开始,从右向左,从下向上调整堆,每次比较父节点和他的左右两个子节点,若大于他们,则和较小的子节点交换。
代码实现
public class Test{
//堆调整
public static void initHeap(int []arry,int i,int len){
int child,temp;
while(2*i+1<len){
child=2*i+1;
if(child+1<len&&arry[child]>arry[child+1]) child++;
if(arry[i]>arry[child]){
temp=arry[i];
arry[i]=arry[child];
arry[child]=temp;
}
i=child;
}
}
//创建堆
public static void Heap(int[]num,int len){
if(len<1) return ;
for(int i=len/2-1;i>=0;i--){
initHeap(num, i, len);
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int [] arry={2, 1, 4, 0, 12, 520, 2, 9, 5, 3, 13, 14};
Heap(arry,arry.length);
System.out.println(Arrays.toString(arry));
}
代码实现