1. 程式人生 > >大頂堆和小頂堆--Java版

大頂堆和小頂堆--Java版

目錄:

1、前期參考

2、大頂堆原理

3、小頂堆原理

4、大頂堆和小頂堆對比圖

5、大頂堆程式碼

6、執行結果

————————————————————————————-

1、前期參考

2、大頂堆原理

       大頂堆原理:根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最大者,稱為大頂堆。大根堆要求根節點的關鍵字既大於或等於左子樹的關鍵字值,又大於或等於右子樹的關鍵字值。

3、小頂堆原理

       小頂堆原理:根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最小者,稱為小頂堆。小根堆要求根節點的關鍵字既小於或等於左子樹的關鍵字值,又小於或等於右子樹的關鍵字值。

4、大頂堆和小頂堆對比圖

這裡寫圖片描述

5、大頂堆程式碼

package com.datastructure;

/***
 *   需求:Java實現大頂堆和小頂堆
 *   
 *   備註:
 *   1、左節點的座標等於父節點的座標*2,右節點的座標等於父節點的座標*2+1
 *   2、變數j是2的倍數,也就是說j是左子節點 
 *   3、【如果小頂堆,則在看while中小頂堆的比較】
 * 
 *   程式碼步驟:
 *   1、整體執行過程:從最大根節點的座標遞減
 *   2、while中的if(j<size)語句,會判斷二叉樹的節點是偶數還是基數
 *   3、如果是偶數則只有左節點,無法比較,只能和父節點比較
 *   4、如果是基數則對比兩個子節點獲取最大值,再與父節點比較
 *   5、父節點大於子節點則退出
 *   6、父節點小於子節點則繼續while迴圈比較
 */
import java.io.*; public class MaxHeap { public static void main(String args[]) throws IOException { int i,size,data[]={0,5,6,10,8,3,2,19,9,11}; //原始陣列內容 size=data.length; System.out.print("原始陣列:"); for(i=1;i<size;i++) System.out.print("["+data[i]+"] "); System.out.println(""
); MaxHeap.heap(data,size); //建立堆積樹 } public static void heap(int data[] ,int size) { int i,j,tmp; for(i=(size/2);i>0;i--) //建立堆積樹節點 MaxHeap.ad_heap(data,i,size-1); System.out.print("\n堆積內容:"); for(i=1;i<size;i++) //原始堆積樹內容 System.out.print("["+data[i]+"] "); } public static void ad_heap(int data[],int i,int size){ int j,tmp,post; j=2*i; tmp=data[i]; post=0; while(j<=size && post==0) { if(j<size) { //if(data[j]>data[j+1]) //小頂堆的比較 if(data[j]<data[j+1]) //找出兩個子節點最大值 j++; } //if(tmp<=data[j]) //小頂堆的比較 if(tmp>=data[j]) //若樹根較大,結束比較過程 post=1; else { data[j/2]=data[j]; //若樹根較小,則繼續比較,這裡將最大子節點賦值給父節點 j=2*j; } } data[j/2]=tmp; //指定樹根為父節點 } }

6、執行結果

原始陣列:[5] [6] [10] [8] [3] [2] [19] [9] [11]

堆積內容:[19] [11] [10] [9] [3] [2] [5] [6] [8]

相關推薦

--Java

目錄: 1、前期參考 2、大頂堆原理 3、小頂堆原理 4、大頂堆和小頂堆對比圖 5、大頂堆程式碼 6、執行結果 ————————————————————————————- 1、前期參考 2、大頂堆原理

POJ1442 找第k的數

題意: 給定M個數,每次可以插入序列一個數;再給N個數,表示在插入第幾個數後輸出一個數,第一次輸出序列中最小的,第二次輸出序列中第二小的……以此類推,直到輸出N個數。 第一次做只用一個優先數列超時了

的建立

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於(或不小於)其左孩子和右孩子節點的值。 (1)根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆。 

(PAT)1147Heaps(判斷是還是)

In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if P is a parent node of C, then

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

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

C++ priority_queue用法(

cplusplus.com template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type&g

排序演算法——排序(

堆排序的思想這裡就先不講了,以後有時間再補上,下面是分別採用大頂堆和小頂堆實現的堆排序。 注意:下面例子中排序的數字是{1,2,5,3,6,4,9,7,8}。 大頂堆方式 #include &

排序,

一如既往,先上詳細的過程圖。 應用場景 比如求10億個數中的最大的前10個數,時時構建只有10個元素的小頂堆,如果比堆頂小,則不處理;如果比堆頂大,則替換堆頂,然後依次下沉到適當的位置。 比如求10億個數中的最小的前10個數,時時構建只有10個元素的大頂堆,如果比堆頂大

Java 排序(

整理網上的最大堆及最小堆程式碼 public abstract class Sorter { public abstract void sort(int[] array); } public class HeapSorter extends

Java中的棧以及棧的區別

數量 nbsp 事先 log 一行 types 得到 基本類型 mmu   在正式內容開始之前要說明一點,我們經常所說的堆棧堆棧是堆和棧統稱,堆是堆,棧是棧,合在一起統稱堆棧;   1.棧(stack)與堆(heap)都是Java用來在Ram中存放數據的地方。與C++不同,

排序,分別利用排序

#include <iostream> using namespace std; //下沉調整(本質上都是上浮調整,只不過是將最小元素上浮) void downAdjust(int array[],int parentIndex,int length) { in

hbase的寫讀,合並合並

記錄 tar 如果 集群 使用 sca hbase lac 完整 Hbase寫: 客戶端向hbase服務器端發送寫的請求時,hbase會同時進行兩個動作,把記錄寫在WAL(write ahead log)日誌文件中,每臺服務器所有表都共享這個WAL文件。然後會寫到memSt

模板

esp printf 最小值 namespace 記得 class queue 二叉 %d 手寫堆 可以視作是一種完全二叉樹結構 #include<iostream> #include<cstring> #include<algor

排序詳解【java附流程圖】

堆排序詳解——java版          近期一直再看別人的原始碼,無意中發現了他裡面使用了堆排序演算法,由於以前對於堆的排序問題都只是聽過,而沒有真正的理解過它和實踐過它。於是也借本次機會了解了一下堆排序的演算法。其實堆的排序是通過二叉樹的形式對元素進行排序,它的規律是:

Linux下檔案分割檔案合併

就像Android中除錯問題,有的時候Log連續儲存會很大,這個時候進行分割就很好地處理檔案了。 在Linux下分割檔案通過split工具進行,合併檔案可以通過cat進行。 1. split a. 可以按行數進行分割 split -l 500 big

經緯座標(BLH)資料建立.kml檔案工具設計 Java

  技術背景      KML,是標記語言(Keyhole Markup Language)的縮寫,最初由Keyhole公司開發,是一種基於XML 語法與格式的、用於描述和儲存地理資訊(如點、線、影象、多邊形和模型等)的編碼規範,可以被 Google Earth 和 Google Maps 識別並顯

排序演算法之氣泡排序快速排序(Java

轉自:http://www.cnblogs.com/0201zcr/p/4763806.html  作者:Whywin 1、氣泡排序 演算法如下(排序後,由小到大排列): /** * 氣泡排序 * 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

我的工具,java串列埠讀寫卡測試工具

工作過程中,經常需要和卡片打交道,如何快速的讀寫卡,提高些工作效率呢?業餘時間,搞了個讀寫卡測試工具, 通過串列埠操作讀卡器。我把車載機改造為串列埠的讀卡器,配合這個工具就可以使用了。如果有網友想使用這個工具,得自己 做個下位機讀卡器了。指令是透傳的,監控發出來的指令

python使用heapq實現(TopK)/(BtmK

參考連結 求一個數列前K大數的問題經常會遇到,在程式中一般用小頂堆可以解決,下面的程式碼是使用python的heapq實現的小頂堆示例程式碼: # !/usr/bin/env python # -*- coding:gbk -*-

CodeForces - 867E Buy Low Sell High (貪心 +

turn ace ios local return 然而 fine 進行 vector https://vjudge.net/problem/CodeForces-867E 題意 一個物品在n天內有n種價格,每天僅能進行買入或賣出或不作為一種操作,可以同時擁有多種物品,