數組中的元素 | A | B | C | D | E | F | G | H | I | J | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
數組的下標 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
struct HeapStruct; typedef struct HeapStruct *PriorityQueue; struct HeapStruct { int Capacity; int Size; ElementType *Elements; }
void Insert(ElementType X, PriorityQueue H) { int i; if (IsFull(H)) { Error("Priority queue is Full"); return; } for (i = ++H->Size; H->Element[i / 2] > X; i /= 2) H->Element[i] = H->Element[i / 2]; H->Element[i] = X; }
這裏還有一個小問題,當\(i = 1\)時程序必須跳出循環,雖說能夠用一個
if
判斷來跳出,但這裏(書上)使用的方法是在位置0
處放一個保證小於堆中的任何值的一個值,避免了每次循環都要執行一次測試,我的感受也是一條思路吧算法
ElementType DeleteMin(PriorityQueue H) { int i, Chile; ElementType MinElement, LastElement; if (IsEmpty(H)) { Error("Priority queue is empty") return; } MinElement = H->Elements[1]; LastElement = H->Elements[H->Size--]; for (i = 1; i * 2 <= H->Size; i = Child) { Child = i * 2; if (Child != H->Size && H->Elements[Child + 1] < H->Elements[Child]) Child++; if (LastElement > H->Elements[Child]) H->Elements[i] = H->Elements[Child]; else break; } H->Elements[i] = LastElement; return MinElement; }
這裏須要考慮的一個問題是一個父節點並不老是有兩個兒子節點,因此會有這麼一條判斷
if (Child != H->Size && H->Elements[Child + 1] < H->Elements[Child]) Child++;
,它有效的保證了不會越界訪問元素而且判斷了兩個子節點的大小(若是有的話)數組