1. 程式人生 > >Java heap的實現 最小堆的實現 程式碼簡潔

Java heap的實現 最小堆的實現 程式碼簡潔

public class HeapMin {
	private int[] Heap;
	private int maxsize;
	private int size;


	public HeapMin(int max) {
		maxsize = max;
		Heap = new int[maxsize];
		size = 0;
		Heap[0] = Integer.MIN_VALUE;
	}


	private int leftchild(int pos) {
		return 2 * pos;
	}


	private int rightchild(int pos) {
		return 2 * pos + 1;
	}


	private int parent(int pos) {
		return pos / 2;
	}


	private boolean isleaf(int pos) {
		return ((pos > size / 2) && (pos <= size));
	}


	private void swap(int pos1, int pos2) {
		int tmp;
		tmp = Heap[pos1];
		Heap[pos1] = Heap[pos2];
		Heap[pos2] = tmp;
	}


	public void insert(int elem) {
		size++;
		Heap[size] = elem;
		int current = size;
		while (Heap[current] < Heap[parent(current)]) {
			swap(current, parent(current));
			current = parent(current);
		}
	}


	public void print() {
		int i;
		for (i = 1; i <= size; i++)
			System.out.print(Heap[i] + " ");
		System.out.println();
	}


	public int removemin() {
		swap(1, size);
		size--;
		if (size != 0)
			pushdown(1);
		return Heap[size + 1];
	}


	private void pushdown(int position) {
		int smallestchild;
		while (!isleaf(position)) {
			smallestchild = leftchild(position);
			if ((smallestchild < size)
					&& (Heap[smallestchild] > Heap[smallestchild + 1]))
				smallestchild = smallestchild + 1;
			if (Heap[position] <= Heap[smallestchild])
				return;
			swap(position, smallestchild);
			position = smallestchild;
		}
	}


	public static void main(String args[])
	{
		HeapMin hm = new HeapMin(6);
		hm.insert(1);
		hm.insert(30);
		hm.insert(50);
		hm.insert(20);
		hm.insert(70);
		hm.print();
		
	}
}

insert函式包含了ShiftUp的過程。pushDown就是ShiftDown的過程。

要變成最大堆,只需要修改這兩個過程的大於小於

來源:http://wenwen.soso.com/z/q278758109.htm

相關推薦

Java heap實現 實現 程式碼簡潔

public class HeapMin { private int[] Heap; private int maxsize; private int size; public HeapMin(int max) { maxsize = max; Heap

java實現優先權佇列和求大的n個數問題

堆在實現優先權佇列和求最大最小的n個數問題上,有著莫大的優勢! 對於最大堆和最小堆的定義此處不再贅述,課參考網上文章:http://blog.csdn.net/genios/article/details/8157031 本文主要是對最小堆進行實現和應用,僅供新手參考。

用鄰接表和實現Dijkstra 短路演算法 (Java實現

演算法特點: 迪科斯徹演算法使用了廣度優先搜尋解決賦權有向圖或者無向圖的單源最短路徑問題,演算法最終得到一個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的一個子模組。 演算法的思路 Dijkstra演算法採用的是一種貪心的策略,宣告一個數

c++用priority_queue實現,並求解大的n個數

輸出 return bool rand cto and gre main 最小堆 1 //c++用priority_queue實現最小堆,並求解很多數中的最大的n個數 2 #include <iostream> 3 #include <queue&

實現

題目 最小堆實現 解答 public class MinHeap { public static void main(String[] args) { int[] test = {23,42,5,1,56}; heapify(test

【劍指offer】資料流中的中位數(實現

題目描述 如何得到一個數據流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用Insert()方法讀取資料流,使用GetMedian()方法獲取當前讀取資料的中位

實現哈夫曼樹的構造及哈夫曼編碼、解碼

      以下程式的演算法思想主要來自於浙江大學陳越老師主編的資料結構一書。最大堆(最小堆思想差不多)(之後會寫一篇部落格介紹),這裡主要講講哈夫曼樹的定義及實現。 Huffman Tree 相關概念: 結點的路徑長度:從根結點到該結點的路徑上分支的數

運用並查集與實現Kruskal演算法

前言 Kruskal是在一個圖(圖論)中生成最小生成樹的演算法之一。(另外還有Prim演算法,之後會涉及到)這就牽扯到了最小生成樹的概念,其實就是總權值最小的一個連通無迴路的子圖。(結合下文的示意圖不難理解)這裡的程式碼並沒有用圖的儲存結構(如:矩陣,鄰接連結

---實現的插入與刪除

堆 堆在優先順序佇列的各種實現中,是最高效的一種資料結構 假定在各個資料記錄(或元素)中存在一個能夠標識資料記錄(或元素)的資料項,並將依據該資料項對資料進行組織,則可資料項成為關鍵碼(key) 如果有一個關鍵碼的集合K = {k0 , k1 , k2

演算法導論實現k路歸併

問題:請給出一個時間為O(nlgk),用來將k個已排序連結串列合併為一個排序連結串列的演算法。此處的n為所有輸入連結串列中元素的總數。(提示:用一個最小堆來做k路合併) 程式設計思路: 假設k個連結串列都是非降序排列的。 (1)取k個元素建立最小堆,這k個元素分別是

網路程式設計中實現的定時器

在開發Linux網路程式時,通常需要維護多個定時器,如維護客戶端心跳時間、檢查多個數據包的超時重傳等。如果採用Linux的SIGALARM訊號實現,則會帶來較大的系統開銷,且不便於管理。 本文在應用層實現了一個基於時間堆的高效能定時器,同時考慮到定時的粒度問題,

go利用實現優先佇列

實現程式碼 package core import "container/heap" type Item struct { Value interface{} Index

排序 大堆 Java實現

堆排序 最大堆 最小堆 Java 堆排序啊,其實是一種數據結構,二叉樹,二叉樹分為是滿二叉樹和完全二叉樹。一棵深度為 k,且有 2k - 1 個節點稱之為滿二叉樹,完全二叉樹:深度為 k,有 n 個節點的二叉樹,當且僅當其每一個節點都與深度為 k 的滿二叉樹中序號為 1 至 n 的節點對應時,

大堆、定義及其C++程式碼實現

資料:https://blog.csdn.net/guoweimelon/article/details/50904346 但是它的最大堆刪除部分的程式碼有問題,詳見連結裡的評論區 定義 堆首先必須是一棵完全二叉樹 最大堆:完全二叉樹,父節點的值不小於子節點的值 最小堆:完全二叉樹,父節

C++ Heap 實現&大堆)

堆 heap 堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結 堆分為兩種,最大堆,最小堆。 最大堆:根節點大於左右兩個子節點的完全二叉樹 最小堆:根節點小於左右兩個子節點的完全二叉樹 堆可以用陣列來儲存, a[i]處存根節點,a[2 * i]存左子樹的根節點 ; a[2 * i + 1]

java實現化到系統托盤圖示的程式碼

花了幾天時間學習了一下java如何實現系統托盤圖示,本來在最程式碼上看到有相關程式碼,但是發現非常複雜,於是自己寫了一個簡潔的,不為牛幣,只為和大家分享一下。 由最程式碼官方編輯於2014-6-27 13:36:38

java實現

<pre name="code" class="plain">//從大牛那裡轉來的最小堆的動態新增與刪除,以後好好看 public class Node {/** * 堆結點 * 節點資料型別為:int */private int iDate;public No

C++ multiset通過greater、less指定排序方式,實現大堆、功能

    STL中的set和multiset基於紅黑樹實現,預設排序為從小到大。     定義三個multiset例項,進行測試: multiset<int, greater<int>> greadterSet;

&&大堆的實現(c++)(轉)

template<class T>class MaxHeap {public:    MaxHeap(int MaxHeapSize =10);    ~MaxHeap() {delete [] heap;}    int Size() const {return CurrentSize;}   

【演算法】大堆(大頂)及)的實現

此坑待埋。 下面來說一說具體演算法。 堆排序解釋第一篇(描述不太清楚) 1.堆   堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質:   Key[i]<=key[2i+1]&&Key[i]<=key[2i+2