C語言之堆的簡單操作實現

2021-10-06 14:26:58 字數 2655 閱讀 3450

一:堆的概念

(1)定義

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

(2)性質

1.堆中某個節點的值總是不大於或不小於其父節點的值;

2.堆總是一棵完全二叉樹。

(3)小根堆示例圖

二:堆的實現

(1)堆的建立

例如:int a[ ] = ;

a.初始化堆

b.交換3 和 6

c.交換5 和 8

d.交換1 和 8

調整1和8的位置,8的左子樹構成的結構被破壞,每一次調整元素的時候都有可能破壞其子堆的結構。

(2)堆的插入

先將數字插入到陣列的尾部,然後進行向上調整演算法,直到滿足堆。

例如:在乙個堆中插入80

(3)堆的刪除

刪除堆是刪除堆頂的資料,將堆頂的資料根最後乙個資料一換,然後刪除陣列最後乙個資料,再進行向下調整演算法。

三:堆的**實現

#include

"common.h"

#define heapdatatype int

typedef

struct heap

heap;

void

heapinit

(heap *php,

int n)

;void

minheapinsert

(heap *php, heapdatatype x)

;heapdatatype minheapremove

(heap *php)

;bool heapempty

(heap *php)

;void

(heap *php)

;void

heapsort

(heap *php)

;void

adjustup

(heapdatatype *base,

int start)

;void

adjustdown

(heapdatatype *base,

int start,

int n)

;void

heapinit

(heap *php,

int n)

bool heapempty

(heap *php)

void

minheapinsert

(heap *php, heapdatatype x)

}heapdatatype minheapremove

(heap *php)

void

(heap *php)

void

adjustup

(heapdatatype *base,

int start)

else

break;}

base[j]

= tmp;

}void

adjustdown

(heapdatatype *base,

int start,

int n)

else

break;}

}void

heapsort

(heap *php,

int ar,

int n)

int end = n-1;

while

(end >0)

int k = php->size -1;

for(

int i=

0; i

++i)

}

c語言之單鏈表簡單操作

建立鍊錶有倆種方式,一種是頭插法,一種是尾插法,倆種方法大同小異,在此我介紹尾插法。用圖示的方法很好理解。下面是用尾插法建立鍊錶的 struct student int n 記錄存放資料數目 struct student create p2 next null return head 建立過程結束 ...

C語言之堆記憶體管理

棧記憶體的大小是有限的 堆記憶體的大小受物理記憶體限制 棧記憶體中的資料釋放是不受程式設計師控制的 函式結束後,屬於它的棧記憶體就會被系統自動釋放,它不適合長期存放資料 堆記憶體無法與識別符號建立對應關係 必須使用指標來指向堆記憶體 c語言中沒有管理堆記憶體的語句 標準庫提供了一套函式來管理堆記憶體...

C語言之檔案操作

fseek 函式 int fseek file stream,long offset,int whence 功能分析 第乙個引數為檔案指標,第二個引數表示偏移量,第三個引數表示從什麼地方開始偏移 返回值為0 表示成功,1表示失敗 whence的數值 seek set 檔案的起始位置 0 seek c...