數據結構:堆的實現

1.堆的概念

如果有一個關鍵碼的集合 K = { k1 ,k2 ,k3 ,…,kn },把它的所有元素按完全二叉樹的順序存儲方式存儲在一個一維數組中,并且 k(i)?< k(i*2+1) 和?k(i)?< k(i*2+2), i = 0 1 , 2…,則稱為小堆 ( 或大堆 ) 。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

1.1堆的性質?

堆中某個節點的值總是不大于或不小于其父節點的值;
堆總是一棵完全二叉樹。

1.2堆的存儲結構

?

2.堆的實現

? 堆的構建
?堆的銷毀
?堆的插入
? 堆的刪除
? 取堆頂的數據
? 堆的數據個數
? 堆的判空

2.1堆的構造與銷毀

?

void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = 0;php->capacity = 0;
}

?2.2堆的向上與向下調整

void swap(DataType*str1, DataType*str2)
{DataType temp = *str1;*str1 = *str2;*str2 = temp;
}
//向上調整(前提是上面是一個堆)
void AdjustUp(DataType* a, int child)
{//利用孩子找父親,并且比較int parent = (child - 1) / 2;while (child > 0){// "<" 和 ">"取決與建立大小堆if (a[child] < a[parent]){swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
//向下調整(前提是下面左右子樹是一個堆)
void AdjustDown(int* a, int n, int parent)//n是數量
{//利用父親找兒子并比較大小int child = parent * 2 + 1;while (child < n){//child + 1 < n可能沒有右孩子,防止越界風險if (child + 1 < n && a[child + 1] < a[child]){child++;}// "<" 和 ">"取決與建立大小堆if (a[child] > a[parent]){swap(&a[child], &a[parent]);parent = child;int child = parent * 2 + 1;}elsebreak;}
}

2.3?堆的插入與堆的刪除

//先插入一個數到數組的尾上,再進行向上調整算法,直到滿足堆
void HeapPush(HP* php, DataType x)
{assert(php);//判斷是否要擴容if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;DataType* temp = (DataType*)realloc(php->a, newCapacity * sizeof(DataType));if (temp == NULL){perror("realloc fail");return;}php->a = temp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size - 1);
}
//刪除堆是刪除堆頂的數據,將堆頂的數據根最后一個數據一換,然后刪除數組
//最后一個數據,再進行向下調整算法。
void HeapPop(HP* php)
{assert(php);swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdjustDown(php->a, php->size, 0);
}

2.4堆的數據個數與堆的判空和取得堆的堆頂元素

DataType HeapTop(HP* php)
{assert(php);assert(!HeapEmpty(php));return php->a[0];
}
bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}int HeapSize(HP* php)
{assert(php);return php->size;
}

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

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

相關文章

MongoDB增刪改查操作

數據庫操作&#xff1a; 在MongoDB中&#xff0c;文檔集合存在數據庫中。 要選擇使用的數據庫&#xff0c;請在mongo shell程序中發出 use <db> 語句 // 查看有哪些數據庫 show dbs;// 如果數據庫不存在&#xff0c;則創建并切換到該數據庫&#xff0c;存在則直接切換到…

分布式消息中間件

消息中間件是Java開發消息隊列的一種中間件產品。中間件類似windows編程開發中的插件。工具插件在軟件工具中是中間插件。插件也是應用程序。消息的分發過程包裝之后是chatlog 系統或者是手機短信。系統與系統之間的通信通過消息的發送和接收。堆積頻繁過多的系統通知消息需要進…

C++之模板進階

模板進階 非類型模板參數模板的特化概念函數模板特化類模板特化全特化偏特化 模板分離編譯什么是分離編譯模板的分離編譯解決方法 模板總結 非類型模板參數 模板參數分兩種&#xff1a;類型形參與非類型形參。 類型形參&#xff1a;出現在模板參數列表中&#xff0c;跟在class…

docker安裝consul

1、下載consul鏡像 docker pull consul2、啟動consul docker run -d --restartalways --name consul -p 8500:8500 consul agent -server -bootstrap-expect1 -ui -bind0.0.0.0 -client0.0.0.03、查看consul日志 docker logs consul4、檢驗是否安裝成功

drawio----輸出pdf為圖片大小無空白(圖片插入論文)

自己在寫論文插入圖片時為了讓論文圖片放大不模糊&#xff0c;啥方法都試了&#xff0c;最后摸索出來這個。 自己手動畫圖的時候導出pdf總會出現自己的圖片很小&#xff0c;pdf的白邊很大如下如所示&#xff0c;插入論文的時候后雖然放大不會模糊&#xff0c;但是白邊很大會顯…

【數據結構OJ題】用隊列實現棧

原題鏈接&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/ 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 可以用兩個隊列去實現一個棧&#xff0c;每次始終保持一個隊列為空。 入棧相當于給非空隊列進行入隊操作。 出棧相…

異步電機IM-改進的電壓模型磁鏈觀測器學習

導讀&#xff1a;本期文章主要介紹異步電機的改進型電壓模型磁鏈觀測器。傳統純積分形式的積分器在低速區域存在初始值問題和直流偏置問題&#xff0c;所以在實際應用中必須對電壓模型進行改進。本期文章中的對電壓模型改進是借鑒一篇IEEE中的方法。 如果需要文章中對應的仿真…

Apache Dubbo 云原生可觀測性的探索與實踐

作者&#xff1a;宋小生 - 平安壹錢包中間件資深工程師 Dubbo3 可觀測能力速覽 Apache Dubbo3 在云原生可觀測性方面完成重磅升級&#xff0c;使用 Dubbo3 最新版本&#xff0c;你只需要引入 dubbo-spring-boot-observability-starter 依賴&#xff0c;微服務集群即原生具備以…

貪心算法實現找零問題

思路&#xff1a; 使用 貪心算法 的思想 題目&#xff1a; 檸檬水找零 在檸檬水攤上&#xff0c;每一杯檸檬水的售價為5美元。顧客排隊購買你的產品,一次購買一杯。 每位顧客只買一杯檸檬水,然后向你付5美元、10美元或20美元。必須給每個顧客正確找零 注意,一開始你手頭沒有任何…

PSP - 基于擴散生成模型預測蛋白質結構 EigenFold 算法與環境配置

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132357976 Paper: EigenFold: Generative Protein Structure Prediction with Diffusion Models EigenFold 是用于蛋白質結構預測的擴散生成模型…

使用深度學習實現的圖像偽造檢測: 一個Python畢業項目指南

1. 引言 在當前的數字化時代&#xff0c;圖像處理和偽造技術越來越先進。從影視制作到社交媒體&#xff0c;人們常常與修飾或改變過的圖片打交道。雖然這為創意產業提供了無數機會&#xff0c;但也為不誠實的內容創造者帶來了偽造和篡改圖像的機會。因此&#xff0c;圖像偽造檢…

Selenium手動和自動兩種方式啟動Chrome驅動

1. 自動啟動chrome驅動(已經安裝了Selenium庫和Chrome驅動) 要使用Selenium自動跟隨自帶的Chrome驅動&#xff0c;你需要首先確保你已經安裝了Selenium庫和Chrome驅動。然后&#xff0c;你可以按照以下步驟進行操作&#xff1a; 導入必要的庫&#xff1a; from selenium imp…

【面試八股文】每日一題:談談你對線程的理解

每日一題-Java核心-談談你對線程的理解【面試八股文】 Java線程是Java程序中的執行單元。一個Java程序可以同時運行多個線程&#xff0c;每個線程可以獨立執行不同的任務。線程的執行是并發的&#xff0c;即多個線程可以同時執行。 1. 線程的特點 Java中的線程有如下的特點 輕…

react-native-webview使用postMessage后H5不能監聽問題(iOS和安卓的兼容問題)

/* 監聽rn消息 */ const eventListener nativeEvent > {//解析數據actionType、extraconst {actionType, extra} nativeEvent.data && JSON.parse(nativeEvent.data) || {} } //安卓用document&#xff0c;ios用window window.addEventListener(message, eventLis…

Jenkins-發送郵件配置

在Jenkins構建執行完畢后&#xff0c;需要及時通知相關人員。因此在jenkins中是可以通過郵件通知的。 一、Jenkins自帶的郵件通知功能 找到manage Jenkins->Configure System&#xff0c;進行郵件配置&#xff1a; 2. 配置Jenkins自帶的郵箱信息 完成上面的配置后&#xf…

DiffusionDet: Diffusion Model for Object Detection

DiffusionDet: Diffusion Model for Object Detection 論文概述不同之處整體流程 論文題目&#xff1a;DiffusionDet: Diffusion Model for Object Detection 論文來源&#xff1a;arXiv preprint 2022 論文地址&#xff1a;https://arxiv.org/abs/2211.09788 論文代碼&#xf…

kubesphere 使用流水線對接 sonar

官方文檔&#xff1a;使用圖形編輯面板創建流水線 創建憑證 創建 sonar 憑證 創建 gitlab 憑證 創建流水線 創建流水線&#xff0c;編輯流水線 自定義流水線 拉取代碼 代理選 kubernetes&#xff0c;label 填maven 添加步驟 - git 填寫 git 地址&#xff0c;選…

CSS 背景屬性

前言 背景屬性 屬性說明background-color背景顏色background-image背景圖background-repeat背景圖平鋪方式background-position背景圖位置background-size背景圖縮放background-attachment背景圖固定background背景復合屬性 背景顏色 可以使用background-color屬性來設置背景…

【計算機設計大賽】國賽一等獎項目分享——基于多端融合的化工安全生產監管可視化系統

文章目錄 一、計算機設計大賽國賽一等獎二、項目背景三、項目簡介四、系統架構五、系統功能結構六、項目特色&#xff08;1&#xff09;多端融合&#xff08;2&#xff09;數據可視化&#xff08;3&#xff09;計算機視覺&#xff08;目標檢測&#xff09; 七、系統界面設計&am…

esp-idf的電源管理——軟件的總體結構

idf的電源管理在軟件上,從上到下可以分為三層: freeRTOS idle taskesp pmesp sleepesp sleep又可以進一步細分為兩層,分別是軟件sleep flow以及最終落實到硬件寄存器的rtc sleep。更具體的,函數調用關系如下: #mermaid-svg-WunrsW7XSArlvBnG {font-family:"trebuchet…