一、堆的概念
堆資料結構是一種資料物件,它可以被視為一棵完全二叉樹結構。
堆的二叉樹儲存是:
最大堆:每個父節點都大於其孩子結點;
最小堆:每個父節點都小於其孩子結點。
二、堆的實現
1.堆的結構體
typedef struct heap heap;
2.堆的初始化
堆的初始化就是對結構體中的 size 和 cmp函式指標進行初始化,size =0,cmp有倆種選項可供選擇:大堆(greater)和小堆(less)。
int less(heaptype a,heaptype b)
//堆的初始化
void heapinit(heap* heap, compare cmp)
heap->size = 0;
heap->cmp = cmp;
return;
}
3.列印堆與元素的交換
堆的列印:為了清晰的對堆元素進行檢視;
//層序遍歷堆
void print_heap(heap heap,char* msg)
//2.判斷堆是否為空
if(heap->size == 0)elseelse}}
++heap->size;
return;
}
5.取堆頂元素
//取堆頂元素
int heaproot(heap* heap, heaptype* value)
//2.判斷堆是否為空,空堆返回0,否則返回1
if(heap->size == 0)else
}
6.刪除堆頂元素
首先判斷是否為空堆,如果為空堆直接返回,否則將堆首元素與堆末元素進行交換,對size進行--操作,然後調整堆的結構,使變化後的堆重新滿足堆的結構。
//刪除堆頂元素
void heaperase(heap* heap)
//2.判斷堆是否為空
if(heap->size == 0)elseelse
}elseelse
}}elseelse}}
}return;
}
7.堆的銷毀
堆的銷毀,可以直接將堆結構體中的size置為0就好,此處進行了大規模的處理,是為了方便使用堆對陣列進行排序。
//堆的銷毀
void heapdestroy(heap* heap)
//2.判斷是否為空堆
if(heap->size == 0)else
return;
}}
8.堆排序
堆排序實質上是為了解決陣列的排序,如果要將陣列進行公升序排列,就採用大堆實現,如果要將陣列進行降序排列,就採用小堆實現。
//堆排序函式
void heapsort(heaptype array, size_t size);
heapsort(array,sizeof(array)/sizeof(array[0]));
return;
}//堆銷毀的檢測函式
void textheapdestroy()
//刪除堆頂元素的檢測函式
void textheaperase()
//取堆頂元素的檢測函式
void textheaproot()
//堆插入的檢測函式
void textheapinsert()
//堆初始化的檢測函式
void textheapinit()
10.主函式
//主函式
int main()
11.檢測結果*******對堆進行初始化***********
*******堆插入四個元素***********
4 3 2 1
*******取堆頂元素***********
ret except:1 actual:1
value except:4 actual:4
*******刪除堆頂元素***********
3 1 2
*******堆刪除***********
*******heapsord***********
1 2 3 4
堆的基本操作
堆的基本概念 如果有乙個關鍵碼的集合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...