<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
邏輯結構上類似於 一棵 “樹”
大頂堆結構: 一種特殊的樹:其每個子節點均比母節點要小
小頂堆結構: 同理:其每個子節點均比母節點要大
結構圖示:
這裡實現堆 用循序表的方式
①初始化:
typedef int Heaptype; typedef struct Heap { Heaptype* head; int size; //記錄堆總容量 int capacity; //記錄當前資料總個數 }Heap; //堆的初始化 void Heap_Init(Heap* pphead) { assert(pphead); pphead->head = NULL; pphead->size = 0; pphead->capacity = 0; }
②插入資料:
實現細節:資料在插入的同時,要進行資料結構的調整,使樹頂始終保持最大數
如果新插入節點比母節點大的話,要進行交換 ,因此將這個調整結構的環節獨立出來
即:“向上調整”。
向上調整:因為插入資料時:新資料預設儲存在順序表尾,因此其邏輯上是在堆的底部,
所以,當新資料比母節點大時,它將與邏輯上處於其上方的母節點交換,稱為
向上調整。
注:向上調整有時不止調整一次 ,還有可能調整多次,直到每個節點都在其相應位置 。
流程圖解:
大頂堆插入流程
細節點:因為資料是以順序表的方式儲存,所以子節點的下標與母節點的下標符合
公式:parent = (child - 1)/2 ;(按照此公式帶入計算就理解了)
//向上調整 void adjust_up(Heap* pphead) { int child = pphead->capacity; int parent = (child - 1) / 2; for (; pphead->head[parent] < pphead->head[child];)//判斷是否符合大頂堆 { swap(&(pphead->head[parent]),&(pphead->head[child]));//進行交換 child = parent; parent = (child - 1) / 2; } } //插入資料 void Heap_push(Heap* pphead, Heaptype data) { assert(pphead); //判斷是否滿容量並擴容 Heap_realloc(pphead); pphead->head[pphead->capacity] = data; //向上調整 adjust_up(pphead); pphead->capacity++; }
③刪除資料:為了避免因為直接刪除頭部資料導致整個堆的結構打亂,
這裡先將頭部資料與尾資料交換,然後將尾部資料刪除,接著使用“向下調整”,即:將換上來的頂部資料向下與其子節點比較調整,直至符合大頂堆結構為止。
注:1.大頂堆向下調整時,母節點要與兩個子節點中較大的一個交換 ,因此要比較一下。
2.這裡下標的計算公式為:左孩子:child = (parent * 2) + 1
右孩子:child = (parent * 2) + 2
3.計算孩子下標時要避免越界,避免將母節點與不屬於堆中的資料比較。
//刪除資料 void Heap_pop(Heap* pphead) { assert(pphead); assert(pphead->capacity > 0); //防止堆為空 //將頂部資料與尾部資料交換 swap(&(pphead->head[0]),&( pphead->head[pphead->capacity-1])); pphead->capacity--; //向下調整 adjust_down(pphead,0); } //向下調整 void Adjust_down(int* a, int size, int parent) { assert(a); for (int child = parent * 2 + 1; child <= size; child = parent * 2 + 1) { //預設用左孩紙與母節點比較,如果右孩紙比左孩紙大且不越界則交換 if (a[child] > a[child + 1] && child + 1 <= size) child = child + 1; //比較孩紙和母節點 if (a[child] < a[parent]) { int temp = a[child]; a[child] = a[parent]; a[parent] = temp; } //向下繼續比較 parent = child; } }
④擴容 || 判空 || 取頂資料 || 銷燬堆
//判斷是否擴容 void Heap_realloc(Heap* pphead) { assert(pphead); if (pphead->size == pphead->capacity) { Heaptype Newsize = (pphead->size == 0) ? 4 : (pphead->size * 2); Heaptype* Newhead = (Heaptype*)realloc(pphead->head,sizeof(Heaptype) * Newsize); if (Newhead == NULL) { perror("realloc"); exit(-1); } pphead->head = Newhead; pphead->size = Newsize; } } //判斷堆是否為空 bool Heap_Empty(Heap* pphead) { if (pphead->capacity) return false; return true; } //取對頂資料 Heaptype Heap_top(Heap* pphead) { return pphead->head[0]; } //銷燬堆 void Heap_Destory(Heap* pphead) { assert(pphead); free(pphead->head); pphead->head = NULL; pphead->size = 0; pphead->capacity = 0; }
以上就是C語言實現大頂堆的範例程式碼的詳細內容,更多關於C語言大頂堆的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45