堆及其應用(優先順序佇列,TopK問題,堆排序)

2021-08-19 23:34:31 字數 1546 閱讀 4700

完整**:

首先建立乙個無序完全二叉樹序列,然後自底向上調整每乙個非葉結點。調整規則是將調整結點值變為比左右孩子結點都小(小根堆),若不滿足,迴圈調整到樹下層,稱為向下調整。

為什麼從最後的非葉結點向前調整?因為每次調整起碼要保證當前結點比左右子樹結點都小,而如果從跟結點開始調整只能保證跟結點比左右孩子值小。

void adjust(heap *heap, int parent)

}//與父交換,或者調整完畢

if (heap->compare(heap->array[child], heap->array[parent] ))

else

}}

將待插元素放到堆尾,逐步與父節點比較,直到放入合適位置,稱為向上調整。

為何只需要和父節點比較?因為原本堆已經滿足父節點是左右子樹中最小的。

void insertheap(heap *heap, datatype data)

int i = 0;

for (i = 0; i < heap->size; i++)

heap->array = pnew;

heap->capacity = newcap;

}heap->array[heap->size++] = data;

//向上調整

int parent = (heap->size - 2) >> 1;

int cur = heap->size - 1;

while (parent >= 0)

else

}return;

}

堆頂元素與堆尾元素交換,刪除堆尾,調整堆頂。

void deleteheap(heap *heap)

else

if(heap->size ==1)

}

優先順序佇列和堆的性質完全吻合。

每次出隊的是值最小的(堆頂)。封裝乙個堆就可以了。

海量資料一次裝不到記憶體裡,需要分批處理。此時建立堆,或者外部排序解決。

堆的思想是,建立乙個固定大小的小根堆,將資料剩餘元素逐個與堆頂比較,如果大於堆頂,說明比堆裡最小的元素大,那麼將堆頂元素刪除,插入這個較大元素。

void topk(int data, int len, int top)

res--;

}//此時堆元素就是最大的5個元素

int i = 0;

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

}

void heapsort(int

array, int len)

//建立大根堆

heap heap;

initheap(&heap, less);

createheap(&heap, array, len);

//堆頂元素放陣列末尾,移除堆頂元素,調整堆頂元素

while (len--)

destroyheap(&heap);

}

堆的應用 優先順序佇列

標頭檔案 pragma once ifndef heap h define heap h typedef int datatype typedef int compare datatype left,datatype right typedef struct heap heap void creat...

堆應用 優先順序佇列(Priority Queue)

優先順序佇列的實現方法有很多種,這裡我們通過堆來構建 以降序,大堆為例 1.入佇列 通過尾插的方式入佇列,因為會破壞原有的堆結構,所以通過向上調整恢復堆結構。2.出佇列 若直接取出隊首元素的話,會影響後面元素的位置,所以我們將隊首元素與隊末元素交換,尾刪 size 再將交換後的0號元素進行向下調整,...

堆(優先順序佇列)

c 的 stl 中提供了 優先佇列 這一容器,它和普通的 fifo 佇列都定義在 中,有 push 和 pop 過程,分別表示 往佇列裡加入新元素 和 從佇列裡刪除隊首元素 唯一的區別是,在優先佇列中,元素並不是按照進入佇列的先後順序排列,而是按照優先順序的高低順序排列 換句話說,pop 刪除的是優...