堆在物理意義上是乙個陣列。
堆在邏輯意義上是乙個完全二叉樹
大堆:父》 =子
小堆:父<=子
宣告堆的一些基本函式(介面),你別忘了測試單元!
#define _crt_secure_no_warnings 1
#pragma once
#include #include #include typedef int hpdatatype;//型別
typedef struct heap
heap;
void heapinit(heap*hp, hpdatatype*a, int n);//建立堆
void heapdestory(heap*hp);//銷毀堆
hpdatatype heaptop(heap*hp);//取堆頂元素
int heapsize(heap*hp);/堆的大小
int heapempty(heap*hp);//判斷堆是否為空
//不直接調heaps
void heapsort(hpdatatype*a, int n);//用堆求取海量資料top k問題
void testheap();//測試
建立堆的步驟:
1.匯入陣列中的數進入堆中;
2.初始化大小,容量
3.利用類似遞迴的分治來調整陣列中的順序,從而將陣列調整為滿足堆的定義。
void heapinit(heap*hp, hpdatatype*a, int n)//初始化函式
//堆排序
for (int i = (n - 2) / 2; i >= 0; --i)
}
流程圖如下:
利用分治的思想從下向上調整堆裡的排列。
資料結構 堆(建立,插入,刪除,排序)
關於二次總結是否有必要,我覺得是有的,參考學習別人的知識,內化的過程是一次總結的過程。每次參考同乙個人的思維軌跡,確實能培養思維。該篇筆記整理理由 在pat advanced level的heap path一題,參考了關於堆的正序遍歷的映象。於是參考一下堆相關筆記。void createheap v...
資料結構 堆的常規操作(建堆,刪除,插入)
寫在前面 該篇文章 柳婼 資料結構 堆 堆排序筆記 堆的一些性質 堆是一棵完全二叉樹,樹的每個結點的值都不小於 或者不大於 其左右孩子的值。父親結點大於等於孩子結點的值叫做大頂堆,反之叫做小頂堆 大頂堆的每個結點的值都是以它為根結點的子樹的最大值,反之最小值 下面都以大頂堆為例子 兩個兄弟之間不存在...
堆的建立,插入,刪除
堆的概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或者最大堆 其實這麼多乾乾的概念還是很不好理解的 先來說一下什麼是完全二叉樹 如果一顆具有n個結點的二叉樹的結構與滿...