堆排序
用堆封裝優先順序佇列
海量資料topk問題
堆的完整源**
什麼是堆
首先,堆是完全二叉樹。
小堆: 任何乙個節點的值都小於它的左右孩子的值,位於堆頂節結點的值是最小的,從根結點到每個結點的路徑上陣列元素組成的序列是遞增的。
大堆:任何乙個節點的值都大於它的左右孩子的值,位於堆頂節結點的值是最大的,從根結點到每個結點的路徑上陣列元素組成的序列是遞減的。
堆的基本操作簡單解析
建堆
//建立堆
void createheap(heap *hp, datatype *array, int
size)
hp->_capacity = size;
//找出最後乙個非葉子節點
int root = (size - 1 - 1) >> 1;
//調整元素
for (; root >= 0; root--)
adjustdown(hp,root);
}
向下調整演算法(小堆為例)void adjustdown(heap *hp, datatype parent)
//如果雙親大於孩子,則交換
if (hp->cmp(hp->_array[child], hp->_array[parent]))
else
}}
插入元素void
insertheap(heap *hp, datatype
data)
向上調整演算法(插入元素)
在插入之前堆已經使最小堆了,因此插入元素之後,需要重新對堆進行調整。
void adjustup(heap *hp, int child)
else
break;
}}
刪除元素void deleteheap(heap *hp)
堆的基本操作
堆的基本概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 如下圖 分別為小堆和大堆 堆的操作具體 如下 測試環境 vs201...
堆的基本操作
堆的資料結構 對於堆,有最大堆和最小堆,在定義乙個堆的時候用乙個陣列表示堆,同時為了方便定義堆的大小,用乙個 size 表示堆的有效元素,同時為了區別最大堆和最小堆,我們用乙個函式指標表示這個堆是最大堆還是最小堆.typedef int compare heaptype parent,heaptyp...
堆的基本操作
heap.h ifndef heap h define heap h 定義乙個函式指標 typedef int pf hdatatype left,hdatatype right typedef int hdatatype typedef struct heap heap int greater h...