完整**:
首先建立乙個無序完全二叉樹序列,然後自底向上調整每乙個非葉結點。調整規則是將調整結點值變為比左右孩子結點都小(小根堆),若不滿足,迴圈調整到樹下層,稱為向下調整。
為什麼從最後的非葉結點向前調整?因為每次調整起碼要保證當前結點比左右子樹結點都小,而如果從跟結點開始調整只能保證跟結點比左右孩子值小。
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 刪除的是優...