C 資料結構 堆 Heap 的實現

2021-10-06 07:56:31 字數 3012 閱讀 1343

現在有乙個陣列, 邏輯上可看做一棵完全二叉樹.堆(heap)就是用陣列實現的完全二叉樹

堆分為兩種:大根堆和小根堆

在大根堆中, 父節點的值比每乙個子節點的值都要大; 在小根堆中, 父節點的值比每乙個子節點的值都要小

這裡將用**建立乙個小根堆

**如下:

標頭檔案heap.h

#pragma once

#include

#include

#include

// 定義堆的結構

typedef

int hpdatatype;

typedef

struct heap

heap;

void

heapcreate

(heap* hp, hpdatatype* a,

int n)

;//堆的建立

void

adjustdown

(hpdatatype* a,

int n,

int root)

;//向下調整演算法,建堆或者堆的刪除時使用

void

heapdestory

(heap* hp)

;//堆的銷毀

void

(heap* hp, hpdatatype x)

;//堆的插入

void

adjustup

(int

* a,

int child)

;//向上調整演算法,向堆中插入資料時使用

void

(heap* hp)

;//堆的刪除

hpdatatype heaptop

(heap* hp)

;//獲取堆頂資料

intheapempty

(heap* hp)

;//判斷堆是否為空

void

(heap* hp)

;//列印堆中資料

void

swap

(int

* a,

int* b)

;//交換函式

void

heapsort

(int

* a,

int n)

;//堆排序

原始檔

heap.c

#include

"heap.h"

void

swap

(int

* a,

int* b)

void

adjustup

(int

* a,

int child)

else}}

void

adjustdown

(hpdatatype* a,

int n,

int root)

// 1、孩子比父親小,則交換,繼續往下調

// 2、孩子比父親大,則停止調整

if(a[parent]

> a[child]

)else}}

void

heapcreate

(heap* hp, hpdatatype* a,

int n)

}void

heapdestory

(heap* hp)

void

(heap* hp, hpdatatype x)

hp->_a[hp->_size]

= x;

hp->_size++

;// 向上調整,調成堆

adjustup

(hp->_a, hp->_size -1)

;}void

(heap* hp)

hpdatatype heaptop

(heap* hp)

intheapempty

(heap* hp)

void

(heap* hp)

printf

("\n");

}// 將陣列降序排列

void

heapsort

(int

* a,

int n)

int end = n -1;

while

(end >0)

}

test.c

#include

"heap.h"

intmain()

;int sz =

sizeof

(a)/

sizeof

(a[0])

; heap hp;

// 堆的建立

printf

("建立後的堆:\n");

heapcreate

(&hp, a, sz);(

&hp)

;// 堆的插入

printf

("向堆中插入資料6,並重新調堆:\n");

(&hp,6)

;(&hp)

;// 堆的刪除

printf

("刪除堆頂資料,並重新調堆:\n");

(&hp);(

&hp);(

&hp)

;heapdestory

(&hp)

;// 堆排序

printf

("堆排序(降序):\n");

heapsort

(a, sz)

;for

(int i =

0; i < sz;

++i)

printf

("\n");

return0;

}

執行結果:

資料結構 堆的實現(heap)

堆分為兩種 最大堆和最小堆 最大堆 父節點的值比每乙個子節點的值都要大。最小堆,父節點的值比每乙個子節點的值都要小。heap實現 heap.h include include include include include typedef int hpdatatype typedef struct ...

資料結構 堆(heap)

堆 heap 也被稱為優先佇列 priority queue 佇列中允許的操作是先進先出 fifo 在隊尾插入元素,在隊頭取出元素。而堆也是一樣,在堆底插入元素,在堆頂取出元素,但是堆中元素的排列不是按照到來的先後順序,而是按照一定的優先順序排列的。這個優先順序可以是元素的大小或者其他規則。如圖一所...

資料結構 堆 heap

陣列表示 公式運算 堆就是用陣列實現的完全二叉樹,所以它沒有使用父指標或者子指標。堆根據 堆屬性 來排序,堆屬性 決定了樹中節點的位置。堆的根節點中存放的是最大或者最小元素,但是其他節點的排序順序是未知的。例如,在乙個最大堆中,最大的那乙個元素總是位於 index 0 的位置,但是最小的元素則未必是...