最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java語言實現(xiàn)最大堆代碼示例

 更新時間:2017年12月05日 15:02:38   作者:GoldArowana  
這篇文章主要介紹了Java語言實現(xiàn)最大堆代碼示例,具有一定參考價值,需要的朋友可以了解下。

最大堆

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

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

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 孩子節(jié)點下角標是child,父節(jié)點下角表是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數(shù)組中某個元素的下角標
   * @param b data數(shù)組中某個元素的下角標
   * @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數(shù)組中某個元素的下角標
   * @param b data數(shù)組中某個元素的下角標
   * @param c data數(shù)組中某個元素的下角標
   * @return 哪個元素大就返回哪個的下角標
   */
	private int max(int a, int b, int c) {
		int biggest = max(a, b);
		biggest = max(biggest, c);
		return biggest;
	}
	/**
   * @param father 父節(jié)點下角標是father,左右兩個孩子節(jié)點的下角表分別是: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即將更新,父、左、右三個結(jié)點誰大,newFather就是誰的下角標
			if (lchild > size) {
				//如果該father結(jié)點既沒有左孩子,也沒有右孩子
				return;
			} else if (rchild > size) {
				//如果該father結(jié)點只有左孩子,沒有右孩子
				newFather = max(father, lchild);
			} else {
				//如果該father結(jié)點既有左孩子,又有右孩子
				newFather = max(father, lchild, rchild);
			}
			if (newFather == father) {
				//說明father比兩個子結(jié)點都要大,表名已經(jīng)是大根堆,不用繼續(xù)調(diào)整了
				return;
			} else {
				//否則,還需要繼續(xù)調(diào)整堆,直到滿足大根堆條件為止
				swap(father, newFather);
				//值進行交換
				father = newFather;
				//更新father的值,相當于繼續(xù)調(diào)整shiftDown(newFather)
			}
		}
	}
	public static void main(String[] args) {
		//創(chuàng)建大根堆
		MaxHeap<Integer> maxHeap = new MaxHeap<Integer>(100);
		//向堆里存
		for (int i = 0; i < 100; i++) {
			maxHeap.insert((int) (Math.random() * 100));
		}
		//創(chuàng)建數(shù)組
		Integer[] arr = new Integer[100];
		//從堆里取,放進數(shù)組里
		for (int i = 0; i < 100; i++) {
			arr[i] = maxHeap.popMax();
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
}

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

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),也就是繼續(xù)shiftDown(newFather);
			}
		}
	}
	public static void main(String[] args) {
		//創(chuàng)建大根堆
		MaxHeap<Integer> maxHeap = new MaxHeap<Integer>(100);
		//向堆里存
		for (int i = 0; i < 100; i++) {
			maxHeap.insert((int) (Math.random() * 100));
		}
		//創(chuàng)建數(shù)組
		Integer[] arr = new Integer[100];
		//從堆里取,放進數(shù)組里
		for (int i = 0; i < 100; i++) {
			arr[i] = maxHeap.popMax();
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
}

總結(jié)

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

相關(guān)文章

  • Java復(fù)制文件常用的三種方法

    Java復(fù)制文件常用的三種方法

    今天小編就為大家分享一篇關(guān)于Java復(fù)制文件常用的三種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 基于Java文件輸入輸出流實現(xiàn)文件上傳下載功能

    基于Java文件輸入輸出流實現(xiàn)文件上傳下載功能

    這篇文章主要為大家詳細介紹了基于Java文件輸入輸出流實現(xiàn)文件上傳下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • mybatis-plus多表關(guān)聯(lián)查詢功能的實現(xiàn)

    mybatis-plus多表關(guān)聯(lián)查詢功能的實現(xiàn)

    本文給大家介紹mybatis-plus多表關(guān)聯(lián)查詢功能的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • Spring boot中使用Spring-data-jpa方便快捷的訪問數(shù)據(jù)庫(推薦)

    Spring boot中使用Spring-data-jpa方便快捷的訪問數(shù)據(jù)庫(推薦)

    Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規(guī)范的基礎(chǔ)上封裝的一套JPA應(yīng)用框架,可使開發(fā)者用極簡的代碼即可實現(xiàn)對數(shù)據(jù)的訪問和操作。這篇文章主要介紹了Spring-boot中使用Spring-data-jpa方便快捷的訪問數(shù)據(jù)庫,需要的朋友可以參考下
    2018-05-05
  • 詳解Java修飾符

    詳解Java修飾符

    Java語言提供了很多修飾符,主要分為以下兩類:訪問修飾符;非訪問修飾符。修飾符用來定義類、方法或者變量,通常放在語句的最前端。我們通過下面的例子來說明,下面就跟小編一起來看下吧
    2016-12-12
  • java實現(xiàn)注冊登錄系統(tǒng)

    java實現(xiàn)注冊登錄系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)注冊登錄系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 一篇文章帶你深入了解javaIO基礎(chǔ)

    一篇文章帶你深入了解javaIO基礎(chǔ)

    這篇文章主要介紹了java 基礎(chǔ)知識之IO總結(jié)的相關(guān)資料,Java中的I/O分為兩種類型,一種是順序讀取,一種是隨機讀取,需要的朋友可以參考下,希望對你有幫助
    2021-08-08
  • 基于IDEA,Eclipse搭建Spring Boot項目過程圖解

    基于IDEA,Eclipse搭建Spring Boot項目過程圖解

    這篇文章主要介紹了基于IDEA,Eclipse搭建Spring Boot項目過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • springboot?jpa?實現(xiàn)返回結(jié)果自定義查詢

    springboot?jpa?實現(xiàn)返回結(jié)果自定義查詢

    這篇文章主要介紹了springboot?jpa?實現(xiàn)返回結(jié)果自定義查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 基于注解的springboot+mybatis的多數(shù)據(jù)源組件的實現(xiàn)代碼

    基于注解的springboot+mybatis的多數(shù)據(jù)源組件的實現(xiàn)代碼

    這篇文章主要介紹了基于注解的springboot+mybatis的多數(shù)據(jù)源組件的實現(xiàn),會使用到多個數(shù)據(jù)源,文中通過代碼講解的非常詳細,需要的朋友可以參考下
    2021-04-04

最新評論

内丘县| 石首市| 舒兰市| 射洪县| 吉林市| 公安县| 远安县| 康马县| 施甸县| 阳原县| 华坪县| 修武县| 烟台市| 岳阳市| 永寿县| 通道| 营口市| 武汉市| 德清县| 南木林县| 黑水县| 谢通门县| 锦州市| 和平县| 合江县| 衡东县| 鸡泽县| 呈贡县| 远安县| 和顺县| 正镶白旗| 蓬莱市| 长武县| 绥芬河市| 老河口市| 西吉县| 柏乡县| 蒙山县| 九江县| 忻州市| 庆云县|