堆:是一種特殊的完全二叉樹
大堆:左右孩子結點均小於父親結點
小堆:左右孩子結點均大於父親結點
用順序表來表示堆
typedef
int hpdatatype;
typedef
struct heap
heap;
堆的建立
void
heapcreat
(heap* hp,hpdatatype* array,
int size)
}
大堆的向下調整
//交換函式
void
swap
(hpdatatype* array,
int left,
int right)
void
shiftdownb
(hpdatatype* array,
int size,
int parent)
else
break;}
}
大堆的向上調整
void
shiftupb
(hpdatatype* array,
int child)
else
//結束調整
break;}
}
小堆的向下調整
void
shiftdownl
(hpdatatype* array,
int size,
int parent)
else
break;}
}
小堆的向上調整
void
shiftupl
(hpdatatype* array,
int child)
else
//結束調整
break;}
}
堆的插入
void
(heap* hp, hpdatatype data)
//尾插
hp->_array[hp->_size++
]= data;
shiftupb
(hp->_array, hp->_size -1)
;}
堆頂元素的刪除(也就是刪除堆中的最值(大堆有最大值,小堆有最小值))
基本步驟:
1.對頂元素與最後乙個葉子結點交換
2.然後進行刪除操作
3.最後在進行向下調整操作
void
(heap* hp)
}
獲取堆頂元素
hpdatatype heaptop
(heap* hp)
堆的銷毀
void
heapdestory
(heap* hp)
堆排序(公升序)
每次都把大堆的根結點放到陣列最後乙個位置,再進行向下調整
void
heapsort1
(int
* array,
int n)
//排序: 迴圈尾刪 : nlogn
int size = n;
while
(size >1)
}
堆排序(降序)
每次都把小堆的根結點放到陣列最後乙個位置,再進行向下調整
void
heapsort2
(int
* array,
int n)
//排序: 迴圈尾刪 : nlogn
int size = n;
while
(size >1)
}
獲取堆中(堆有n個元素)最大的k個元素
void
printtopk
(int
* array,
int n,
int k)
}for
(int i =
0; i < k;
++i)
}
C heap堆的相關操作及跟蹤除錯案例
include 標頭檔案 make heap 建堆,最大值在所給範圍的最前面,其他位置不確定 pop heap 將堆頂 所給範圍最前面 元素移到所給範圍的最後,並將餘下的最大的元素放在最前面 pop back 將所給範圍的最後乙個元素刪除 push back 在所給範圍的末尾加入新的元素 push ...
四 c 中的演算法 排序及相關操作 堆操作
堆 是一種組織序列元素的方式。堆的內部資料結構是二叉樹。兩大性質 1.堆的第乙個元素通常是最大的元素 2.能夠在對數時間內增加或移除乙個元素 堆的操作演算法 push heap pop heap sort heap make heap 等等 函式模型 template class randomit ...
堆操作及應用
1.堆是乙個完全二叉樹,堆主要設計到的操作有插入,刪除,堆化。2.堆的主要應用有堆排序 從小到大排序,使用大頂堆 從大到小排序,使用小頂堆。3.下面以大頂堆為例,給出實現 view code 1 include 2 include 3 4using namespace std 56 大頂堆的實現 7...