數組實現小頂堆

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;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章