堆的基本概念:
如果有乙個關鍵碼的集合k = ,把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足: ki <= k2*i+1 且 ki<= k2*i+2 (ki >= k2*i+1 且 ki >= k2*i+2) i =0,1,2…,則稱為小堆(或大堆)
如下圖:分別為小堆和大堆
堆的操作具體**如下:
測試環境:vs2013
#ifndef __heap_h__
#define __heap_h__
#include
#include
#include
typedef int datatype;
typedef int(*compare)(datatype left, datatype right);//比較方法的函式指標
//堆的內容
typedef struct heap
heap;
//初始化堆
void heapinit(heap* hp, compare com);
//比較方法
//大堆
int greater(datatype left, datatype right);
//小堆
int less(datatype left, datatype right);
//堆的建立
void createheap(heap* hp, datatype* arr, int size);
//插入元素
void insertheap(heap* hp, datatype data);
//刪除堆頂元素
void deleteheap(heap* hp);
//檢視堆頂元素
datatype heaptop(heap* hp);
//檢視堆總元素個數
int heapsize(heap* hp);
//堆判空
int emptyheap(heap* hp);
//銷毀堆
void destoryheap(heap* hp);
#endif
#include "heap.h"
//初始化堆
void heapinit(heap* hp, compare com)
//申請成功
hp->_capacity = 3;
hp->_size = 3;
hp->com = com;
}//比較方法
//大堆
int greater(datatype left, datatype right)
//小堆
int less(datatype left, datatype right)
void _swap(datatype* left, datatype* right)
//向下調整法
void _adjustdown(heap* hp, int parent)
//說明已經是堆
else
return;
}}//堆的建立
void createheap(heap* hp, datatype* arr, int size)
//申請成功
hp->_capacity = size;
hp->_size = size;
//將陣列元素放入堆中
for (; i < size; i++)
hp->arr[i] = arr[i];
//用向下調整法調整堆
for (i = root; i >= 0; i--)
_adjustdown(hp, i);
}void _checkcapacity(heap* hp)
hp->_capacity = 2 * hp->_capacity;
}}//向上調整法
void _adjustup(heap* hp, int child)
//說明已經是堆
else
return;
}}//插入元素
void insertheap(heap* hp, datatype data)
//刪除堆頂元素
void deleteheap(heap* hp)
//檢視堆頂元素
datatype heaptop(heap* hp)
return hp->arr[0];
}//檢視堆總元素個數
int heapsize(heap* hp)
//堆判空
int emptyheap(heap* hp)
//銷毀堆
void destoryheap(heap* hp)
test.c
#include "heap.h"
void test1()
; int size = sizeof(arr) / sizeof(arr[0]);
heapinit(&hp, less);//初始化堆
createheap(&hp, arr, size);//建立堆,最後乙個引數是函式指標型別,選擇建立大堆或小堆
insertheap(&hp, 11);//向堆插入元素
deleteheap(&hp);//刪除堆頂元素
printf("top = %d size = %d\n", heaptop(&hp), heapsize(&hp));
destoryheap(&hp);//銷毀堆
}int main()
堆的基本操作
堆的資料結構 對於堆,有最大堆和最小堆,在定義乙個堆的時候用乙個陣列表示堆,同時為了方便定義堆的大小,用乙個 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...
堆的基本操作
堆 邏輯上是一顆完全二叉樹 物理上是陣列的形式 順序儲存 作用 找陣列中的前k大的值 特點 大頂堆 任意乙個root的值 左右子樹的值 小頂堆 任意乙個root的值 左右子樹的值 要調整root所在的節點 前提 root的左右子樹都已滿足堆的性質 如果root所在的節點已經是葉子結點,調整結束 找到...