現在有乙個陣列, 邏輯上可看做一棵完全二叉樹.堆(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 的位置,但是最小的元素則未必是...