【數據結構與算法 | 堆篇】JAVA實現小頂堆

1. 堆的特點

  • 堆的邏輯結構是數組,內存結構是完全二叉樹.完全二叉樹即只有最后一層才有葉子節點.
  • 堆又分為大頂堆與小頂堆. 大頂堆的特點是 : 父親節點比孩子節點的都要大. 小頂堆的特點與其相反.
  • Java的優先級隊列(PriorityQueue)的底層實現即用到了小頂堆. 所以下文我們就用Java代碼來實現小頂堆.
  • 本文沒有像實現棧或隊列那樣使用了泛型,為了方便省去了泛型的步驟.

2. 小頂堆的實現

(1). 主要操作 :?

  • 堆化:傳入一個數組,從下到上,最后一個非葉子節點開始,再從上到下不斷進行下沉操作.
  • offer()添加元素:從數組尾部添加元素,不斷上浮.
  • poll()彈出堆首元素.將堆首元素與最后一個葉子節點互換,size--,再從堆首開始下沉操作即可.

(2). 代碼實現

//代碼實現小頂堆
//邏輯結構是數組
public class MyHeap {private int size;private int[] heap;public MyHeap(int capacity) {heap = new int[capacity];}//堆化public void heapify(int[] arr) {for (int i = 0; i < arr.length; i++) {heap[i] = arr[i];}size = arr.length;//第一步 : 找到最后一個非葉子節點//第二步 : 從該節點出發, 從后往前, 以此堆化//size - 1即最后一個葉子節點, 依據公式, 該則為葉子節點的父親節點for (int parent = (size - 1) / 2; parent >= 0; parent--) {int leftChild = parent*2 + 1;int rightChild = parent*2 + 2;int min = parent;//如果存在左孩子, 而且父親節點比孩子節點要大if (leftChild < size && heap[min] > heap[leftChild]) {min = leftChild;}//如果存在右孩子, 而且右孩子的值比左孩子和父親還要小if (rightChild < size && heap[min] > heap[rightChild]) {min = rightChild;}//如果最小值不是父親, 那么需要下沉if (min != parent) {down(parent);}}}private void swap(int a, int b) {int temp;temp = heap[a];heap[a] = heap[b];heap[b] = temp;}private void down(int parent) {int leftChild = parent*2 + 1;int rightChild = parent*2 + 2;int min = parent;if (leftChild < size && heap[min] > heap[leftChild]) {min = leftChild;}if (rightChild < size && heap[min] > heap[rightChild]) {min = rightChild;}if (min != parent) {swap(min, parent);down(min);}}//向堆中添加元素, 如果該添加的元素比父親節點(如果有的話)要小,//則需要上浮public void offer(int a) {if (size > heap.length) {return;}heap[size] = a;int child = size;size++;int parent;while (child >= 0) {parent = (child - 1) / 2;//如果添加的元素要比父親要小if (heap[parent] > heap[child]) {swap(parent, child);child = parent;} else {//如果添加后父親節點仍然符合小頂堆, 那么退出循環, 無需再上浮break;}}}//返回堆頂元素public int peek() {return heap[0];}//彈出堆頂元素//第一步 : 將最后一個葉子節點與堆頂元素互換, size--//第二步 : 從堆頂開始不斷下沉public int poll() throws Exception {if (size == 0) {throw new Exception();}int value = peek();swap(0, size - 1);size--;//不斷下沉int parent = 0;down(parent);return value;}
}

3. 單元測試

public class MyHeapTest {@Testpublic void test1() throws Exception {MyHeap heap = new MyHeap(10);int[] arr = new int[]{9, 12, 4, 3, 1};heap.heapify(arr);System.out.println(heap.peek());//1System.out.println(heap.poll());//1System.out.println(heap.peek());//3heap.offer(0);System.out.println(heap.peek());//0}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19962.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

K210視覺識別模塊學習筆記3:內存卡寫入拍攝圖片_LED三色燈的操作_按鍵操作_定時器的配置使用

今日開始學習K210視覺識別模塊: LED三色燈的操作_按鍵操作_定時器的配置使用_內存卡寫入拍攝圖片 亞博智能的K210視覺識別模塊...... 本文最終目的是編寫一個按鍵拍照的例程序&#xff1a; 為以后的專用場景的模型訓練做準備&#xff0c;因為訓練自己的模型需要大量的圖片&a…

jmeter基礎入門練習題

jmeter存在A,B兩個線程組的情況下&#xff0c;默認設置下&#xff0c;運行順序是&#xff1a;A A&#xff1a;A,B同時運行 B&#xff1a;先運行A&#xff0c;在運行B C&#xff1a;先運行A&#xff0c;等待2s運行B D:先A運行完&#xff0c;等待默認設置時間后運行B 下列說法正…

編譯安裝PHP服務(LAMP3)

目錄 1.初始化設置&#xff0c;將安裝PHP所需軟件包傳到/opt目錄下 &#xff08;1&#xff09;關閉防火墻 &#xff08;2&#xff09;上傳軟件包到/opt目錄 2.安裝GD庫和GD庫關聯程序&#xff0c;用來處理和生成圖片 3.配置軟件模塊 4.編譯及安裝 5.優化把PHP 的可執行程…

nginx的安裝001

Nginx是一款高性能的HTTP和反向代理服務器&#xff0c;以及郵件代理服務器&#xff0c;由 Igor Sysoev 開發并公開發布于2004年。Nginx以其高并發處理能力、低內存消耗和穩定性著稱&#xff0c;特別適合部署在高流量的網站上。 操作系統&#xff1a; CentOS Stream 9 安裝步驟…

【算法訓練 day44 分割等和子集】

目錄 一、分割等和子集-LeetCode 416思路實現代碼1.二維dp代碼2.一維dp代碼 問題總結 一、分割等和子集-LeetCode 416 Leecode鏈接: leetcode 416 文章鏈接: 代碼隨想錄 視頻鏈接: B站 給你一個 只包含正整數 的 非空 數組 nums 。請你判斷是否可以將這個數組分割成兩個子集&…

SQL入門教程,很詳細

SQL&#xff08;Structured Query Language&#xff09;是一種用于管理關系數據庫的標準語言。它被廣泛用于存儲、操作和檢索數據。在這篇文章中&#xff0c;我們將介紹SQL的基本概念和常用命令。 首先&#xff0c;我們需要了解SQL的基本結構。SQL語句通常由以下幾個部分組成&…

頭歌數據結構與算法課程設計易-算式運算的合法性

給定一個算式運算&#xff0c;算式由運算數、、-、、/、(、)組成&#xff0c;請編寫程序判斷該算式運算是否合法。如果合法&#xff0c;計算該算式的值。 輸入描述&#xff1a; 第一行輸入一個運算表達式 輸出描述&#xff1a; 如果表達式合法則計算其值&#xff0c;結果保留兩…

c語言之向文件讀寫數據塊

c語言需要向文件讀寫數據塊需要用到fread語句和fwrite語句 fread語句的語法格式 fread(butter,size,count,fp) butter&#xff1a;讀取的數據存入內存地址 size:讀取的字節大小 count:讀取數據的個數 fp:讀取的文件指針 fwrite語句語法格式 fwrite(butter,size,count,fp…

企業如何利用社交媒體二維碼做宣傳?提升品牌形象

和普通的二維碼不同&#xff0c;社交媒體二維碼可以通過一個二維碼鏈接企業的超過16的社交媒體渠道鏈接&#xff0c;包括&#xff1a;企業官網、小程序、公眾號、淘寶店鋪、抖音鏈接、小紅書鏈接、美團鏈接、餓了么鏈接…等等。掃描之后&#xff0c;可以在這個社交媒體二維碼界…

校園志愿者|基于SprinBoot+vue的校園志愿者管理系統(源碼+數據庫+文檔)

校園志愿者管理系統 目錄 基于SprinBootvue的校園志愿者管理系統 一、前言 二、系統設計 三、系統功能設計 1 系統功能模塊 2管理員功能 3志愿者功能 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&a…

采購訂單審批和取消例子

文章目錄 1 Introduction2 Example 1 Introduction This is a exmaple for releaseing po and reseting po. 2 Example DATA:lw_in TYPE zmms015,lw_out TYPE zmms015_out,lt_head LIKE TABLE OF ZMMT003_head,lw_head TYPE ZMMT003_head,lt_item TYPE zmmt003_item_t,lt…

12.RedHat認證-Linux文件系統(下)

12.RedHat認證-Linux文件系統(下) swap虛擬內存 我加一個硬盤做實驗sdc # 創建交換分區&#xff08;不用做成邏輯卷也能靈活分區&#xff09; [rootcentos8 ~]# fdisk /dev/sdc -l Disk /dev/sdc&#xff1a;10 GiB&#xff0c;10737418240 字節&#xff0c;20971520 個扇區 …

REX 521饋線保護繼電器提供 您的高效中壓網絡 保護、測量、監控和基本 控制功能

REX 521饋線保護繼電器提供 您的高效中壓網絡 保護、測量、監控和基本 控制功能。典型的REX 521應用包括輸入和輸出饋線 在隔離中性點中&#xff0c;諧振接地&#xff0c;牢固 接地和電阻接地系統。 …完善ABB繼電器解決方案系列 這種最先進的保護繼電器補充了ABB的一系列解決方…

深入理解linux文件系統與日志分析

深入理解linux文件系統與日志分析 linux文件系統: 文件是存儲在硬盤上的&#xff0c;硬盤上的最小存儲單位是扇區&#xff0c;每個扇區的大小是512字節。 inode&#xff1a;元信息&#xff08;文件的屬性 權限&#xff0c;創建者&#xff0c;創建日期等等&#xff09; block…

【AVL Design Explorer DOE】

AVL Design Explorer DOE 1、關于DOE的個人理解2、DOE參考資料-知乎2.1 DOE發展及基本類型2.2 DOE應用場景2.3 Mintab 中的 DOE工具3、AVL Design Explorer DOE示例 1、關于DOE的個人理解 仿真和試驗一樣&#xff0c;就像盲人摸象&#xff0c;在不知道大象的全景之前&#xff…

Java 垃圾回收

一、概述 GC GC(Garbage Collection)&#xff0c;在程序運行過程中內存空間是有限的&#xff0c;為了更好的的使用有限的內存空間&#xff0c;GC會將不再使用的對象清除然后將其所占用的內存釋放出來。 java的垃圾回收機制 Java的垃圾收集&#xff08;Garbage Collection, …

嵌入式Linux復制剪切刪除指令詳解

指令操作 1. cp 復制指令 a. 用法&#xff1a;cp [ 選項 ] [ 源文件或目錄 ] [ 目標文件或目錄 ]&#xff1b; b. 用途&#xff1a;用于復制文件或目錄&#xff1b; c. 通常情況下&#xff0c;復制的都不是空文件夾&#xff0c;所以直接使用 cp 復制空文件會失敗&#xff0…

創建Django項目及應用

1 創建Project 1個Project可以對應多個app django-admin startproject myproject 2 創建App python manage.py startapp app01 INSTALLED_APPS [# ...app01,app02,# ... ] 如果要讓這個應用在項目中起作用&#xff0c;需要在項目的 settings.py 文件的 INSTALLED_APPS 配置…

java中成員內部類、局部內部類、匿名內部類各自的特點

成員內部類&#xff1a;定義在類的內部&#xff0c;方法的外部&#xff0c;成員內部類作為外部類的成員&#xff0c;可以直接訪問外部類的私有屬性。 局部內部類&#xff1a;定義在方法的內部&#xff0c;對于局部內部類我們常常使用一個方法&#xff0c;得到一個接口實現類的…

臭氧濃度傳感器在食品廠與制藥廠中的應用

在食品廠和制藥廠的生產過程中&#xff0c;消毒是一個至關重要的環節。有效的消毒可以確保產品免受微生物污染&#xff0c;從而保障消費者的健康。近年來&#xff0c;臭氧作為一種廣譜殺菌劑&#xff0c;因其強效的消毒能力和低污染性&#xff0c;在食品廠和制藥廠的消毒過程中…