資料結構 堆的理解和基本操作

2021-08-20 12:51:08 字數 3591 閱讀 5421

一.堆的概念

如果有乙個關鍵碼的集合k=,把他所有元素按照完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足:ki <= k2*i+1 且 ki<= k2*i+2 (ki >= k2*i+1 且 ki >= k2*i+2) i = 0,1,2…,則稱為小堆(或大堆)。

小堆:從上圖可以看出小堆的特點是:任意一節點的數值都要大於堆頂的結點資料(孩子結點大於根節點,左右孩子可以不分大小排序)。堆頂元素最小。從根節點到每個結點的路徑上陣列元素組成的序列是遞增的。

大堆:從上圖可以看出大堆的特點是:任意一節點的資料都要小於堆頂的結點資料(孩子結點小於根節點,左右孩子可以不分大小排序)。堆頂元素最大。從根節點到每個結點的路徑上陣列元素組成的序列是遞減的。

堆儲存在下標為0開始的陣列中,因此在堆中給定下標為i的結點時:

(1)  如果i=0,結點i是根節點,沒有雙親節點;否則結點i的雙親結點為 結點(i-1)/2

(2) 如果2 * i + 1 <= n - 1,則結點i的左孩子為結點2 * i + 1,否則結 點i無左孩子

(3)如果2 * i + 2 <= n - 1,則結點i的右孩子為結點2 * i + 2,否則結 點i無右孩

二.堆的基本操作(一下操作都是建立小堆)

1.堆的建立

2.堆的插入和刪除

堆的插入:在已經建成的最小堆的後面插入新元素,插入之後,當樹 中結點不滿足堆的性質時,就需要對堆進行重新調整

堆的刪除:刪除時每次刪除堆頂元素

3.堆的銷毀

4.列印堆

三.實現**

heap.h

#pragma once

#include#include#include#includetypedef int datatype;

typedef struct heap

heap;

//建立堆

void greateheap(heap* hp,int* array,int size);

//向下調整堆

void adjustheapdown(heap* hp,int parent);

//堆中插入元素

void insertheap(heap* hp, datatype data);

//向上調整

void adjustup(heap* hp, int child);

//刪除元素

void deleteheap(heap* hp);

//堆中元素的個數

int sizeheap(heap* hp);

//判斷堆是否為空

int emptyheap(heap* hp);

//銷毀堆

void destoryheap(heap* hp);

//列印堆

int printheap(heap* hp);

heap.c

//建立堆

void greateheap(heap* hp,int* array, int size)

//將容量賦為size

hp->capacity = size;

//放置元素

for (int i = 0; i < size; i++)

hp->size = size;

//找到最後乙個非葉子節點

int root = (size - 2) / 2;

//調整堆

for (; root+1 >0; root--)

adjustheapdown(hp,root);

}//交換兩個數

void swap(int* array1,int* array2)

//調整堆

void adjustheapdown(heap* hp,int parent)

else

return; }}

//列印堆

int printheap(heap* hp)

int i = 0;

for (i; i < hp->size; i++)

printf("\n");

return 0;

}//堆中插入元素

void insertheap(heap* hp, datatype data)

//檢查堆是否需要增容

void cheakcapacity(heap* hp)

//拷貝元素

for (; i < hp->size; i++)

temp[i] = hp->array[i] ;

//釋放舊空間

free(hp->array);

hp->capacity = newcapacity;

hp->array = temp;

}}//向上調整

void adjustup(heap* hp, int child)

else

return; }}

//刪除元素

void deleteheap(heap* hp)

//堆中元素的個數

int sizeheap(heap* hp)

//判斷堆是否為空

int emptyheap(heap* hp)

//銷毀堆

void destoryheap(heap* hp)

}

test.c

void testheap()

; int size = sizeof(array) / sizeof(array[0]);

heap hp;

greateheap(&hp,array,size);

printheap(&hp);

insertheap(&hp, 33);

printheap(&hp);

deleteheap(&hp);

printheap(&hp);

printf("size=%d",sizeheap(&hp));

printf("\n");

}int main()

資料結構堆的基本操作實現

堆 其實就是一棵完全二叉樹 見下圖 在陣列中的實現 堆分為大根堆和小根堆 大根堆 1.根節點最大 2.子節點必須大於等於父節點 小跟堆 1.根節點最小 2.子節點必須小於等於父節點 在陣列中儲存這種結構時,總是習慣將根節點儲存在陣列下標為1的位置 每乙個下標為k的節點的父節點的下標就是k 2 每乙個...

資料結構 堆的操作

堆是指乙個完全二叉樹,它的某個結點的值總是不大於,或不小於其父節點的值,堆分為大堆和小堆,小堆堆頂元素一定是最小的,堆頂到每個葉子結點的路徑是公升序的,大堆則相反。堆的操作主要包括堆的建立,插入元素,刪除元素,返回堆頂元素等操作,其中,堆的建立要用到向下調整演算法,插入要用到向上調整演算法,具體操作...

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

heap.h pragma once includetypedef int heaptype define heapmaxsize 1000 typedef int compare heaptype a,heaptype b typedef struct heapheap 初始化 void heap...