import java.util.Scanner;
/**
* 堆最重要的性質就是兒子的值一定不小於父親的值。
* @author:JZ
* @date:2020/3/30
*/
public class Main {
static int[] heap = new int[100];
static int size = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = 4;
for (int i = 0; i < n; i++) {
push(in.nextInt());
for (int j = 0; j <= i; j++) {
System.out.print(heap[j]+" ");
}
}
}
/**
* 在向堆中插入數值時,首先在堆的末尾插入該數值
* @param x
*/
public static void push(int x) {
int i = size++;
int p;
while (i > 0) {
// 父節點編號
p = (i-1)/2;
// 如果已經沒有大小顛倒則退出
if (heap[p] <= x) break;
// 把父節點的值放下來,把自己提上去
heap[i] = heap[p];
i = p;
}
heap[i] = x;
}
/**
* 在從堆中刪除最小值時,首先把堆的最後一個節點的數值複製到根節點上,
* 並且刪除最後一個節點。然後不斷向下交換直到沒有大小顛倒位置。
* @return
*/
public static int pop() {
// 最小值
int ret = heap[0];
// 要提到根的值
int x = heap[--size];
// 從根開始向下交換
int i = 0;
while (i*2+1 < size) {
// 比較兒子的值
int l = i*2+1;
int r = i*2+2;
if (r < size && heap[r] < heap[l]) l = r;
// 如果沒有大小顛倒則退出
if (heap[l] <= x) break;
// 把兒子的值提上來
heap[i] = heap[l];
i = l;
}
heap[i] = x;
return ret;
}
}
數組實現小頂堆
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.