1. 程式人生 > >堆的定義與操作

堆的定義與操作

與操作 down 下標 代碼 其中 cap 找到 truct style

  如題,堆的定義與操作。

 1 #define MAXDATA 1000        /* 該值應根據具體情況定義為大於堆中所有可能元素的值 */
 2 
 3 typedef struct HNode *Heap; /* 堆的類型定義 */
 4 typedef int ElememntType;    /* 堆中的元素類型 */
 5 struct HNode {
 6     ElementType *Data;        /* 存儲元素的數組 */
 7     int Size;                /* 堆中當前元素個數 */
 8     int Cap;                /*
堆的最大容量 */ 9 }; 10 typedef Heap MaxHeap; /* 最大堆 */ 11 typedef Heap MinHeap; /* 最小堆 */ 12 13 /* 以最大堆為例 */ 14 15 MaxHeap CreateHeap(int MaxSize) 16 { 17 MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode)); 18 /* 堆中元素下標從 1 開始 */ 19 H->Data = (ElementType*)malloc( (MaxSize+1) * sizeof
(ElementType) ); 20 H->Size = 0; 21 H->Cap = MaxSize; 22 H->Data[0] = MAXDATA; /* 設置 "崗哨" ,大於 堆中所有可能元素的值 */ 23 24 return H; 25 } 26 27 int IsFull(MaxHeap H) 28 { 29 return ( H->Size == H->Cap ); 30 } 31 32 int IsEmpty(MaxHeap H) 33 { 34 return ( H->Size == 0
); 35 } 36 37 void Insert(MaxHeap H, ElementType X) 38 { /* 將 X 插入到 堆 H 中,調整以符合最大堆的特性 */ 39 /* 其中 H->Data[0] 已經定義為哨兵 */ 40 int i; 41 if ( IsFull(H) ) return; // 堆已滿 42 43 i = ++H->Size; 44 for ( ; H->Data[i/2] < X; i/=2 ) 45 H->Data[i] = H->Data[i/2]; // 上濾 X 46 H->Data[i] = X; // 將 X 插入 47 } 48 49 ElementType DeleteMax(MaxHeap H) 50 {/* 從最大堆H中取出鍵值最大的元素,並刪除一個節點 */ 51 int Parent, Child; 52 ElementType MaxItem, X; 53 54 /* 這裏省略判斷堆是否已滿的代碼 */ 55 56 MaxItem = H->Data[1]; /* 取出根節點存放的最大值 */ 57 /* 用 最大堆中最後一個元素從根節點開始向上過濾下層節點 */ 58 X = H->Data[H->Size--]; /* 註意:當前堆的規模要減小 */ 59 for ( Parent = 1; Parent*2 <= H->Size; Parent=Child ) { 60 Child = Parent * 2; 61 if ( (Child != H->Size) && (H->Data[Child] < H->Data[Child+1]) ) 62 Child++; /* Chile 指向左右子節點的較大者 */ 63 if ( X >= H->Data[Child] ) break; /* 找到了合適位置 */ 64 else /* 下濾X */ 65 H->Data[Parent] = H->Data[Child]; 66 } 67 H->Data[Parent] = X; 68 69 return MaxItem; 70 } 71 /* -------------建最大堆------------- */ 72 void PercDown(MaxHeap H, int p) 73 {/* 下濾:將 H 中以 H->Data[p] 為根的子堆調整為最大堆 */ 74 int Parent, Child; 75 ElementType X; 76 77 X = H->Data[p]; /* 取出根節點存放的值 */ 78 for ( Parent = 1; Parent*2 <= H->Size; Parent=Child ) { 79 Child = Parent * 2; 80 if ( Child != H->Size && H->Data[Child] < H->Data[Child+1] ) 81 Child++; /* Chile 指向左右子節點的較大者 */ 82 if ( X >= H->Data[Child] ) break; /* 找到了合適位置 */ 83 else /* 下濾X */ 84 H->Data[Parent] = H->Data[Child]; 85 } 86 H->Data[Parent] = X; 87 } 88 89 void BuildHeap(MaxHeap H) 90 {/* 調整 H->Data[] 中的元素,使滿足最大堆的有序性 */ 91 /* 這裏假設所有 H->Size 個元素已經存在 H->Data[] 中 */ 92 93 int i; 94 /* 從最後一個節點的父節點開始,到根節點 */ 95 for ( i = (H->Size)/2; i > 0; i-- ) 96 PercDown(H, i); 97 }

堆的定義與操作