首先我們要將資料結構中的堆和記憶體中的堆區區分開來,記憶體中的堆區是作業系統管理的,和資料結構中的堆沒有半毛錢關係。堆只有兩種,大堆和小堆。
我們通常用乙個陣列來表示乙個堆,陣列中存放的是堆的層序遍歷結果,第乙個元素即根節點
//定義乙個比較函式的函式指標,用來指明該堆是小堆還是大堆
typedef
int (*compare)(heaptype a, heaptype b);
typedef
struct heapheap;
//初始化的時候將堆初始化成大堆或者小堆(傳函式名進去),在進行插入刪除操作的時候用到該函式
int greater(heaptype a, heaptype b)//表示大堆
int less(heaptype a, heaptype b)//表示小堆
//初始化堆
void heapinit(heap* heap,compare cmp)
heap->size =
0; heap->com = cmp;
}//銷毀堆
void heapdestroy(heap* heap)
heap->size =
0;}
可以說上浮
和下潛
是堆裡最重要的兩個操作
//交換函式
void swap(heaptype *a, heaptype *b)
//上浮函式
void adjustup(heap* heap, size_t child)
if(child == 0)
size_t parents = (child - 1)/2;
if(!heap->com(heap->data[parents],heap->data[child]))
else
}//插入元素
void heapinsert(heap* heap, heaptype value)
if(heap->size >= heapmaxsize)
heap->data[heap->size++] = value;
size_t child = heap->size - 1;
adjustup(heap, child);
}
//下潛函式
void adjustdown(heap* heap, size_t parents, size_t size)
size_t child = parents*2 + 1;//先定義其左孩子結點
while(child > 0 && child < size)//如果左孩子結點存在,進入迴圈
}//如果父結點的值小於左右孩子結點中的最大值,就要進行交換
//否則退出迴圈,表明已找到合適位置
if(!heap->com(heap->data[parents],heap->data[child]))
else
}return;
}//刪除堆頂元素
void heaperase(heap* heap)
if(heap->size
<= 0)
swap(&heap->data[heap->size-1], &heap->data[0]);
heap->size--;
adjustdown(heap,0,heap->size);
return;
}
//建立堆
void heapcreate(heaptype array, heap* heap,size_t size)
size_t index = 0;
while(size--)
}
//堆排序
void heapsort(heaptype array, heap* heap, size_t size)
size_t num = size;
heapcreate(array,heap,size);
while(size--)
memcpy(array,heap->data,num*sizeof(heaptype));
}
堆(資料結構)及堆排序
這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...
資料結構 堆的基本操作和堆排序
heap.h pragma once includetypedef int heaptype define heapmaxsize 1000 typedef int compare heaptype a,heaptype b typedef struct heapheap 初始化 void heap...
資料結構 堆以及堆排序
堆可以看作是一棵完全二叉樹,除最後一層外,每一層都是填滿的,最後一層從左到右依次填入 在堆上,對任意乙個結點來說,越接近頂部,權值就越大 一般指大頂堆 並且它的權值大於等於它所在子樹所有點的權值 我們把根結點權值大於等於樹中結點權值的稱為大根堆,小於等於樹種結點權值的稱為小根堆 下圖就是乙個大根堆的...