一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java語言實現最大堆代碼示例

Java語言實現最大堆代碼示例

2021-02-27 14:17GoldArowana JAVA教程

這篇文章主要介紹了Java語言實現最大堆代碼示例,具有一定參考價值,需要的朋友可以了解下。

最大堆

最大堆的特點是父元素比子元素大,并且是一棵完全二叉樹。

data[1]開始存,data[0]空著不用。也可以把data[0]當成size來用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
public class MaxHeap<T extends Comparable<? super T>> {
    private T[] data;
    private int size;
    private int capacity;
    public MaxHeap(int capacity) {
        this.data = (T[]) new Comparable[capacity + 1];
        size = 0;
        this.capacity = capacity;
    }
    public int size() {
        return this.size;
    }
    public Boolean isEmpty() {
        return size == 0;
    }
    public int getCapacity() {
        return this.capacity;
    }
    /**
   * @return 查看最大根(只看不刪, 與popMax對比)
   */
    public T seekMax() {
        return data[1];
    }
    public void swap(int i, int j) {
        if (i != j) {
            T temp = data[i];
            data[i] = data[j];
            data[j] = temp;
        }
    }
    public void insert(T item) {
        size++;
        data[size] = item;
        shiftUp(size);
    }
    /**
   * @return 彈出最大根(彈出意味著刪除, 與seekMax對比)
   */
    public T popMax() {
        swap(1, size--);
        shiftDown(1);
        return data[size + 1];
    }
    /**
   * @param child 孩子節點下角標是child,父節點下角表是child/2
   */
    public void shiftUp(int child) {
        while (child > 1 && data[child].compareTo(data[child / 2]) > 0) {
            swap(child, child / 2);
            child = child / 2;
        }
    }
    /**
   * @param a data數組中某個元素的下角標
   * @param b data數組中某個元素的下角標
   * @return 哪個元素大就返回哪個的下角標
   */
    private int max(int a, int b) {
        if (data[a].compareTo(data[b]) < 0) {
            //如果data[b]大
            return b;
            //返回b
        } else {
            //如果data[a]大
            return a;
            //返回a
        }
    }
    /**
   * @param a data數組中某個元素的下角標
   * @param b data數組中某個元素的下角標
   * @param c data數組中某個元素的下角標
   * @return 哪個元素大就返回哪個的下角標
   */
    private int max(int a, int b, int c) {
        int biggest = max(a, b);
        biggest = max(biggest, c);
        return biggest;
    }
    /**
   * @param father 父節點下角標是father,左右兩個孩子節點的下角表分別是:father*2 和 father*2+1
   */
    public void shiftDown(int father) {
        while (true) {
            int lchild = father * 2;
            //左孩子
            int rchild = father * 2 + 1;
            //右孩子
            int newFather = father;
            //newFather即將更新,父、左、右三個結點誰大,newFather就是誰的下角標
            if (lchild > size) {
                //如果該father結點既沒有左孩子,也沒有右孩子
                return;
            } else if (rchild > size) {
                //如果該father結點只有左孩子,沒有右孩子
                newFather = max(father, lchild);
            } else {
                //如果該father結點既有左孩子,又有右孩子
                newFather = max(father, lchild, rchild);
            }
            if (newFather == father) {
                //說明father比兩個子結點都要大,表名已經是大根堆,不用繼續調整了
                return;
            } else {
                //否則,還需要繼續調整堆,直到滿足大根堆條件為止
                swap(father, newFather);
                //值進行交換
                father = newFather;
                //更新father的值,相當于繼續調整shiftDown(newFather)
            }
        }
    }
    public static void main(String[] args) {
        //創建大根堆
        MaxHeap<Integer> maxHeap = new MaxHeap<Integer>(100);
        //向堆里存
        for (int i = 0; i < 100; i++) {
            maxHeap.insert((int) (Math.random() * 100));
        }
        //創建數組
        Integer[] arr = new Integer[100];
        //從堆里取,放進數組里
        for (int i = 0; i < 100; i++) {
            arr[i] = maxHeap.popMax();
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

最大堆:shiftDown()函數與上面不一樣

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
public class MaxHeap<T extends Comparable<? super T>> {
    private T[] data;
    private int size;
    private int capacity;
    public MaxHeap(int capacity) {
        data = (T[]) new Comparable[capacity + 1];
        this.capacity = capacity;
        size = 0;
    }
    public int size() {
        return size;
    }
    public Boolean isEmpty() {
        return size == 0;
    }
    public void insert(T item) {
        data[size + 1] = item;
        size++;
        shiftUp(size);
    }
    /**
   * @return 彈出最大根(彈出意味著刪除, 與seekMax對比)
   */
    public T popMax() {
        T ret = data[1];
        swap(1, size);
        size--;
        shiftDown(1);
        return ret;
    }
    /**
   * @return 查看最大根(只看不刪, 與popMax對比)
   */
    public T seekMax() {
        return data[1];
    }
    public void swap(int i, int j) {
        if (i != j) {
            T temp = data[i];
            data[i] = data[j];
            data[j] = temp;
        }
    }
    public void shiftUp(int k) {
        while (k > 1 && data[k / 2].compareTo(data[k]) < 0) {
            swap(k, k / 2);
            k /= 2;
        }
    }
    public void shiftDown(int father) {
        while (2 * father <= size) {
            int newFather = 2 * father;
            if (newFather + 1 <= size && data[newFather + 1].compareTo(data[newFather]) > 0) {
                //data[j] data[j+1]兩者取大的那個
                newFather = newFather + 1;
            }
            if (data[father].compareTo(data[newFather]) >= 0) {
                break;
            } else {
                swap(father, newFather);
                //值進行交換
                father = newFather;
                //newFather是(2*father)或者是(2*father+1),也就是繼續shiftDown(newFather);
            }
        }
    }
    public static void main(String[] args) {
        //創建大根堆
        MaxHeap<Integer> maxHeap = new MaxHeap<Integer>(100);
        //向堆里存
        for (int i = 0; i < 100; i++) {
            maxHeap.insert((int) (Math.random() * 100));
        }
        //創建數組
        Integer[] arr = new Integer[100];
        //從堆里取,放進數組里
        for (int i = 0; i < 100; i++) {
            arr[i] = maxHeap.popMax();
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

總結

以上就是本文關于Java語言實現最大堆代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://www.cnblogs.com/noKing/p/7954898.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品久久久久久综合网 | 修修视频在线观看 | 羲义嫁密着中出交尾gvg794 | bt7086新片速递亚洲最新合集 | 天仙tv微福视频 | 青青青青青国产费线在线观看 | 九九九精品视频 | 91传媒制片厂果冻有限公司 | 欧美日韩看看2015永久免费 | 国产精品亚洲午夜一区二区三区 | 天莱男模gary| 久久九九亚洲精品 | 荡娃艳妇有声小说 | 不知火舞被c视频在线播放 不卡一区二区三区卡 | 四虎在线免费 | 视频一区二区 村上凉子 | 免费一级毛片在级播放 | 天堂久久久久va久久久久 | 成人看的羞羞视频免费观看 | 草嫩社区 | 日本高清不卡一区久久精品 | 国产精品免费久久久久影院小说 | 高中生放荡日记高h娜娜 | 欧美成人二区 | 日韩欧美不卡视频 | 久久久这里有精品999 | 91短视频在线播放 | bbbbbbaaaaaa毛片 | 超级毛片 | 欧美伊香蕉久久综合类网站 | 视频一区二区国产 | 99re热这里只有精品视频 | 香蕉久久ac一区二区三区 | 2019年国产不卡在线刷新 | 亚洲 欧美 国产 在线 日韩 | a毛片免费全部在线播放毛 a级在线看 | 男人在线影院 | 午夜欧美精品 | 久久精品视在线观看85 | 欧美一级xxxx俄罗斯一级 | 日韩欧美亚洲天堂 |