優先佇列(二叉堆)的插入程式

2021-06-28 09:41:08 字數 1239 閱讀 2921

《資料結構與演算法分析》習題6.2,這題是問答題,心血來潮下決心用程式實現,程式設計菜鳥前前後後除錯了大概一天時間才完成兩種演算法,下面是第一種演算法,時間複雜度為o(nlogn)。

#include#includetypedef struct heapstruct

*priorityqueue;

priorityqueue initqueue(int n)

int isfull(priorityqueue h)

int isempty(priorityqueue h)

void insert(int x, priorityqueue h)

for(i = ++h->size; h->elements[i/2] > x; i /= 2)

h->elements[i] = h->elements[i/2];

h->elements[i] = x;

}void printqueue(priorityqueue h)

void main()

; int i;

priorityqueue h = initqueue(20);

for(i = 0; i < 15; i++)

insert(input[i], h);

printqueue(h);

}

第二種演算法是將n個關鍵字以任意順序放入書中,保持結構特性。為了保持二叉堆的性質可能需要將父節點下濾,時間複雜度為o(n)。使用swap函式的時候遇到問題,後面將會總結一下swap函式。

#include#includetypedef struct heapstruct

*priorityqueue;

int isfull(priorityqueue h)

int isempty(priorityqueue h)

void swap(int *a, int *b)

void percolatedown(int i, priorityqueue h)

else

}

}priorityqueue buildheap(int a, int n)

int min(int a, int b)

void printqueue(priorityqueue h)

void main()

; printqueue(buildheap(input, 15));

}

優先佇列 二叉堆

優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...

二叉堆 優先佇列

堆 堆常見的二叉堆,這種資料結構有大根堆和小根堆。對於大根堆來說,每個父節點是大於他的兩個孩子節點的。也就是最大值在根節點。小根堆與之相反。如果堆用陣列實現的話,如果從1開始計數 因為0的位置可以在上慮或者下慮的時候做個暫存的位置 那麼乙個孩子的父節點是i 2 如果知道了父節點,而左孩子的節點位置為...

二叉堆(優先佇列)

0.1 本文總結於 資料結構與演算法分析,但源 均為原創 旨在理清二叉堆 優先佇列 堆的其他操作及其應用,以便讓朋友些知道為什麼要學習優先佇列 二叉堆 1.0 優先佇列定義 優先佇列是允許至少下列兩種操作的資料結構,insert 插入 它的工作時顯而易見的,以及 deletemin 刪除最小者 它的...