之前我們討論的堆,都把最大鍵值儲存在根節點中,這種型別的堆可以看作是最大堆。
我們還可以建立另一種堆,把最鍵小值儲存在根節點中,根節點以外的節點的鍵值,大於或等於儲存在它父節點中的鍵值,這種型別的堆可以看作是最小堆。
具體是用最大堆還是最小堆,就根據我們自身的需要來選擇了。
堆的演算法到這裡就講完了,下面這段**包括了之前講過的堆的所有演算法:
#include #include void siftup(int* heap, int index);
void siftdown(int* heap, int index);
void siftdown(int* heap, int siftdownto, int index);
int* insertelement(int* heap, int element);
int* deleteelement(int* heap, int index);
int* makeheap(int* array, int arraylength);
void heapsort(int* heap);
void print(char* description, int* heap);
void siftup(int* heap, int index)
else
index /= 2; }}
void siftdown(int* heap, int index)
void siftdown(int* heap, int siftdownto, int index)
else
}}int* insertelement(int* heap, int element)
resultheap[resultheaplength] = element;
siftup(resultheap, resultheaplength);
return resultheap;
}int* deleteelement(int* heap, int index)
if (index == resultheaplength)
return resultheap;
resultheap[index] = y;
if (y > x)
else
return resultheap;
}int* makeheap(int* array, int arraylength)
for (int i = heaplength / 2; i >= 1; i--)
return heap;
}void heapsort(int* heap)
}void print(char* description, int* heap)
printf("\n");
}void main()
; int* heap = makeheap(array, array_length);
print("從陣列初始化堆", heap);
int* heapafterinsert = insertelement(heap, 20);
print("插入新資料20", heapafterinsert);
free(heap);
int* heapafterdelete = deleteelement(heapafterinsert, 2);
print("刪除第2個資料", heapafterdelete);
free(heapafterinsert);
heapsort(heapafterdelete);
print("按非降序排序", heapafterdelete);
free(heapafterdelete);
getchar();
}
演算法 之 堆 - 簡介
演算法 之 堆 - sift-up和sift-down
演算法 之 堆 - 插入和刪除
演算法 之 堆 - 建立堆
演算法 之 堆 - 排序
演算法 之 堆 建立堆
給出乙個有n個元素的陣列a 1.n 要建立乙個包含這些元素的堆,可以這樣進行 從空的堆開始,不斷插入每乙個元素,直到a完全被轉移到堆中為止。因為插入第j個鍵值用時o log j 因此用這種方法建立堆疊的時間複雜性是o n log n 我們知道對應於堆h 1.n 的樹的節點可以方便地以自頂向下 從左到...
演算法模板之堆 優先佇列
堆的定義 堆結構是一種陣列物件,可以被視為一顆完全二叉樹。樹中的每個節點與陣列中存放該節點中值的那個元素相對應。由上圖不難看出 fa ther i i 2 le ftch ild i i 2 r ight chil d i i 2 1當然也可以用位運算來加快速度 fa ther i i 1 left...
堆基礎知識小結
1 chunk 結構 未分配的chunk prev size size p 0 fd bk unused 已分配chunk prev size size p 1 header malloc返回的位址是這裡,注意與未分配的chunk比較,此處應該是fd的起始位置 data 相鄰的chunk prev ...