日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构-堆(最大堆)

發布時間:2024/9/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-堆(最大堆) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最大堆

實質是一棵完全二叉樹

每個根結點元素的值都比左右兒子的大

每次都是取出堆頂元素(可以說是優先隊列)

代碼

參考自浙大數據結構

#include <iostream> #include <cstdio> #include <algorithm> #define ERROR -1 const int MAXDATA = 1<<30; using namespace std; typedef int ElementType; typedef struct HeapStruct *MaxHeap; struct HeapStruct {ElementType *Elements; /*存儲元素的數組*/int Size; /*當前堆元素個數*/int Capacity; /*堆的最大容量*/ };/*建堆(申請需要的內存)*/ MaxHeap Creat(int MaxSize) {/*創建容量為MaxSize的最大堆*/MaxHeap H = (MaxHeap)malloc(sizeof(struct HeapStruct));H->Elements = (ElementType*)malloc((MaxSize+1)*sizeof(ElementType));H->Size = 0;H->Capacity = MaxSize;H->Elements[0] = MAXDATA; /*定義哨兵為大于所有可能元素的值,以便后面更快操作*/return H; }bool IsFull(MaxHeap H) {return H->Size == H->Capacity; } bool IsEmpty(MaxHeap H) {return H->Size == 0; }void Insert(MaxHeap H,ElementType item) {int i;if(IsFull(H)){printf("最大堆已滿!\n");return;}i = ++H->Size; /*指向堆中最后一個元素的位置*/for( ; H->Elements[i/2] < item; i/=2){H->Elements[i] = H->Elements[i/2]; /*下移小的item*/}H->Elements[i] = item; /*將item插入*/ }ElementType Delete(MaxHeap H) {if(IsEmpty(H)){printf("最大堆為空!\n");return ERROR;}int Parent,Child; /*parent指定最后一個元素temp放的位置*/ElementType MaxItem,temp;MaxItem = H->Elements[1]; /*取出根節點最大值*/temp = H->Elements[H->Size--]; /*用最大堆中最后一個元素從根結點開始向上過濾下層結點*/for(Parent = 1; Parent*2 <= H->Size; Parent = Child){Child = Parent * 2;if((Child < H->Size)&&(H->Elements[Child] < H->Elements[Child+1]))Child++; /*Child指向左右結點較大者*/if(temp >= H->Elements[Child]) break;else /*移動temp到下一層:Parent = Child*/H->Elements[Parent] = H->Elements[Child];}H->Elements[Parent] = temp;return MaxItem; } void PushDown(MaxHeap H,int p) {/*將H中以p為根結點的堆調整為最大堆*/int Parent,Child;ElementType X = H->Elements[p]; /*取根結點存放的值*/for(Parent = p; Parent * 2 <= H->Size; Parent = Child){Child = Parent * 2;if((Child < H->Size) && (H->Elements[Child] < H->Elements[Child+1]))Child++; /*指向更大的結點*/if(X >= H->Elements[Child]) break;else H->Elements[Parent] = H->Elements[Child];/*調整*/}H->Elements[Parent] = X; }/*根據輸入的數據構建好MaxHeap*/ void BuildHeap(MaxHeap H) {/*與刪除一個元素的調整策略相同從最后一個子堆根結點開始依次調整堆*/for(int i = H->Size/2; i > 0; --i){PushDown(H,i);} } int main() {MaxHeap H = Creat(100);H->Size = 10;for(int i = 1; i <= 10; ++i){H->Elements[i] = i;}BuildHeap(H);Insert(H,2021);Insert(H,1998);while(!IsEmpty(H)){printf("%d\n",Delete(H));}return 0; }

總結

以上是生活随笔為你收集整理的数据结构-堆(最大堆)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。