資料結構 堆的基本操作及堆排序

2021-08-20 00:04:45 字數 2345 閱讀 4017

首先我們要將資料結構中的堆和記憶體中的堆區區分開來,記憶體中的堆區是作業系統管理的,和資料結構中的堆沒有半毛錢關係。堆只有兩種,大堆和小堆。

我們通常用乙個陣列來表示乙個堆,陣列中存放的是堆的層序遍歷結果,第乙個元素即根節點

//定義乙個比較函式的函式指標,用來指明該堆是小堆還是大堆

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...

資料結構 堆以及堆排序

堆可以看作是一棵完全二叉樹,除最後一層外,每一層都是填滿的,最後一層從左到右依次填入 在堆上,對任意乙個結點來說,越接近頂部,權值就越大 一般指大頂堆 並且它的權值大於等於它所在子樹所有點的權值 我們把根結點權值大於等於樹中結點權值的稱為大根堆,小於等於樹種結點權值的稱為小根堆 下圖就是乙個大根堆的...