1. 程式人生 > >優先佇列---最大堆:Java語言實現

優先佇列---最大堆:Java語言實現

package Binary_Tree_Study;

/**
 * Created by Administrator on 2018/5/21.
 */
public class MaxHeap {
    private int[] array;//基於堆的完全二叉樹
    private int N = 0;//儲存在array[1...N]中,array[0]沒有使用
    private int maxN;//堆的容量
    public MaxHeap(int maxN) {
        this.maxN = maxN;
        this.array = new int[maxN+1];
    }

    //堆是否為空
    public boolean isEmpty() {
        return N == 0;
    }

    //獲取堆的大小
    public int size() {
        return N;
    }

    //堆是否已滿
    public boolean isFull() {
        return N == maxN;
    }

    //插入操作
    public void insert(int v) {
        if(isFull()) {
            System.out.println("最大堆已滿");
            return;
        }
        array[++N] = v;
        swim(N);
    }

    //刪除最大元素
    public int delMax(){
        if(isEmpty()) {
            System.out.println("最大堆已空");
            return array[0];
        }
        int max = array[1];//從根節點得到最大元素
        exch(1,N--);//將其與最後一個結點交換
        sink(1);//恢復堆的有序性
        return max;

    }

    //輔助方法

    //比較i是否小於j
    private boolean less(int i, int j) {
        if((array[i] -array[j]) < 0)
            return true;
        else
            return false;
    }

    //交換元素
    private void exch(int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    //上浮操作
    private void swim(int k) {
        while (k > 1 && less(k/2, k)) {
            exch(k/2, k);
            k = k/2;
        }
    }

    //下沉操作
    private void sink(int k) {
        while (2*k <= N) {
            int j = 2*k;
            if(j < N && less(j, j+1))
                j++;
            if(!less(k, j))
                break;
            exch(k, j);
            k = j;
        }
    }
}

3 參考資料

後記:

       後續看了一些博文,感覺寫得挺不錯的,在此備註一下,以便以後查閱。

相關推薦

優先佇列---大堆Java語言實現

package Binary_Tree_Study; /** * Created by Administrator on 2018/5/21. */ public class MaxHeap { private int[] array;//基於堆的完全二叉樹 private int N

二叉搜尋樹的插入、刪除、查詢等操作Java語言實現

1 二叉搜尋樹介紹 二叉搜尋樹(BST, Binary Search Tree),也稱二叉排序樹或二叉查詢樹。二叉搜尋樹:一棵二叉樹,可以為空;如果不為空,滿足以下性質:1. 非空左子樹的所有鍵值小於其根結點的鍵值。2. 非空右子樹的所有鍵值大於其根結點的鍵值。3. 左、右子

平衡二叉樹——AVL樹的旋轉操作Java語言實現

1 前言2 平衡二叉樹——AVL樹的旋轉操作2.1 AVL樹的特點 AVL樹本質上還是一棵二叉搜尋樹,它的特點是:1.本身首先是一棵二叉搜尋樹。2.帶有平衡條件:每個結點的左右子樹的高度之差的絕對值(平衡因子)最多為1。也就是說,AVL樹,本質上是帶了平衡功能的二叉查詢樹(二

java語言實現快速尋找小值

新建一個數組,然後放入stream種,最後呼叫min或者max函式得到陣列種的最大最小值。 import java.util.Arrays; import org.apache.commons.lang3.ArrayUtils; public class HelloWor

java語言實現

span 前序 java語言 wot root 存儲 public == class 首先用Node類定義一個節點,用來存儲每個節點的內容: public class Node { // 關鍵字 private int keyData;

鏈表的基本操作java語言實現

auth ndb ack pan log 定義 pac ext col package com.baorant; public class JavaDemo { public static void main(String[] args) {

OSGi是什麽Java語言的動態模塊系統(一)

平臺 使用 數據 osgi servle http cto 優點 重啟 OSGi是什麽 OSGi亦稱做Java語言的動態模塊系統,它為模塊化應用的開發定義了一個基礎架構。OSGi容器已有多家開源實現,比如Knoflerfish、Equinox和Apache的Felix。您可

Java初學者必知Java語言的11大特點

java 後端Java是一種簡單的,面向對象的,分布式的,解釋型的,健壯安全的,結構中立的,可移植的,性能優異、多線程的靜態語言。那麽java語言的特點是什麽呢? 1、Java語言是簡單的 Java 語言的語法與C語言和C++語言很接近,使得大多數程序員很容易學習和使用Java。另一方面,Java丟棄了C++

第二十五節Java語言基礎-面向對象基礎

view https 面向對象設計 ans 重用 -o 數據 *** 對象 面向對象 面向過程的代表主要是C語言,面向對象是相對面向過程而言,Java是面向對象的編程語言,面向過程是通過函數體現,面向過程主要是功能行為。 而對於面向對象而言,將功能封裝到對象,所以面向對

MysqlJava程式碼實現資料庫定時備份與還原詳解

一、目的 使用java程式碼實現定時執行Mysql備份與還原。 二、思路 先寫好一個定時器,每隔多少時間執行一次備份 備份方法為,通過java向命令列寫入命令執行 首先在cmd中模擬備份,測試成功後 使用java程式碼實現資料備份功能

牛客網java入門實現遍歷目錄

專案介紹 遍歷目錄是操作檔案時的一個常見需求。比如寫一個程式,需要找到並處理指定目錄下的所有JS檔案時,就需要遍歷整個目錄。該專案教會你如何使用流式程式設計和lambda表示式,幫助你進一步熟悉java8特性,並且通過它實現目錄遍歷。  

Java語言實現雙鏈表

java語言實現雙鏈表其實很簡單,雙鏈表的基本操作有:增、刪、改、差、取得指定節點的內容、判空、節點個數、清除、輸出。 相對比較難一點的是連結串列的刪除,這裡說明一下具體的實現刪除可以在外部寫一個刪除的方法,此處用的方法非常容易理解,不 用像以前那樣考慮是否為頭結點、是否為空等等,只需要兩步操作即可

No.24 我與程式碼的日常C語言實現簡易通訊錄

#define SIZE 1000 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> typedef struct PersonInfo{ char name[102

分享《OpenCV 3計算機視覺Python語言實現(第2版)》中文PDF+英文PDF+原始碼

下載:https://pan.baidu.com/s/1gGgEk8Y6X58gfvsmD8U8Xw 更多資料分享:https://www.cnblogs.com/javapythonstudy/ 《OpenCV 3計算機視覺:Python語言實現(第2版)》中文PDF+英文PDF+原始碼中文PDF,20

易學筆記-0Java語言總結/0.11 Java中輸出的流表示(都是針對位元組陣列byte[ ]操作)

Java中輸出的流表示 針對快取的: ByteArrayOutputStream StringBufferOutputStream 針對檔案的:FileOutputStream 針對物件:ObjectOutputStream

Java語言實現質數演算法

方法一: public class PrimeNumberExample { public static boolean isPrime(long n) { if(n > 2 && (n & 1) == 0)

資料結構與演算法——線性表之順序表(JAVA語言實現

資料結構與演算法——線性表之順序表(JAVA語言實現 ) 線性表是由n個數據元素組成的優先序列。 線性表中每個元素都必須有相同的結構,線性表是線性結構中最常用而又最簡單的一種資料結構。線性表由儲存結構是否連續可分為順序表和連結串列。順序表指線性表中每個元素按順序依次儲存,線性表中邏

劍指Offer - 複雜連結串列的複製(Java語言實現)

題目描述 輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空) 思路分析: 方法1,藉助Hash

非對稱加密的簽名和驗籤、加密和解密的Java語言實現

本文采用java.security包的簽名和驗籤。採用A的私鑰簽名傳送至B,B採用A的公鑰進行驗籤。 加解密可以私鑰加密、公鑰解密(或者公鑰加密、私鑰解密)。 一般用於銀行報文傳輸、支付寶、微信、銀行以及各大銀行的資料交換。 package com.example.demo; impo

Java語言實現六種排序演算法

Java語言實現六種排序演算法 Java語言實現六種排序演算法 氣泡排序 插入排序 歸併排序 快速排序 希爾排序 選擇排序