資料結構 堆的基本操作實現 獲得陣列中前k個最值

2021-10-05 06:37:09 字數 2151 閱讀 2648

堆是乙個完全二叉樹;

小堆的子節點總是大於父節點的,大堆相反;

堆一般是採用順序結構實現;

#include

#include

#include

#include

typedef

int datatype;

typedef

struct heap

heap;

void

swap

(datatype* array,

int left,

int right)

//大堆,向下調整

void

bigshiftdown

(datatype* array,

int size,

int parent)

if(array[child]

> array[parent]

)else}}

//大堆,向上調整

void

bigshiftup

(datatype* array,

int child)

else}}

//小堆,向下調整

void

shiftdown

(datatype* array,

int size,

int parent)

if(array[child]

< array[parent]

)else}}

//小堆,向上調整

void

shiftup

(datatype* array,

int child)

else}}

//建堆

void

heapcreate

(heap* hp, datatype* array,

int size)

}// 堆的插入

void

(heap* hp, datatype x)

//尾插

hp->array[hp->size++

]= x;

shiftup

(hp->array, hp->size -1)

;}// 堆的刪除

void

(heap* hp)

}// 取堆頂的資料

datatype heaptop

(heap* hp)

// 堆的資料個數

intheapsize

(heap* hp)

// 堆的判空

intheapempty

(heap* hp)

return0;

}//列印堆的每個元素

void

(heap* hp)

printf

("\n");

}//堆的銷毀

void

heapdestory

(heap* hp)

//找最小值建大堆

//找最大值:1.先用前k個資料建小堆

//2.然後依次把剩餘的元素拿來和堆頂元素比較

//3.如果小於堆頂元素,則刪除堆頂元素入堆,否則進行下乙個元素的判斷

void

printtopk

(int

* a,

int n,

int k)

}for

(int i =

0; i < k;

++i)

}int

main()

; heap hp;

//建堆

heapcreate

(&hp, array,11)

;(&hp)

;//堆插

(&hp,22)

;(&hp)

;printf

("堆的個數:%d\n"

,heapsize

(&hp));

//堆刪

(&hp);(

&hp)

;//依此列印出堆頂元素

while

(heapempty

(&hp)!=1

)//求陣列中前k個最值

/*printtopk(array, 11, 3);

return0;

}

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

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

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

目錄 void adjustdown datetype a,int n,int parent if a parent a child else 注意 if裡面的條件語句 child 1 void adjustup datetype a int child else 注意 while裡面的條件語句是不...

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

一.堆的概念 如果有乙個關鍵碼的集合k 把他所有元素按照完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 小堆 從上圖可以看出小堆的特點是 任意一節點的數值都要大於堆頂的結...