1.堆是實現優先佇列的首選資料結構,最常見的是二叉堆。
2.堆的性質:
小頂堆:每乙個父節點的值總是不大於它的孩子節點的值。
大頂堆:每乙個父節點的值總是不小於它的孩子節點的值。
堆包含的操作有:
insert()(插入操作),extractmin()提取最小(用於小頂堆),exectractmax()提取最大(用於大頂堆),peek()讀取,delete()刪除。
3.由於堆是一顆形態規則的二叉樹,所以堆的父節點與孩子節點存在如下關係:
設父節點編號為i,則左兒子節點為2*i+1,右兒子為2*i+2;設孩子節點為i,則其父節點為(i-1)/2.
具體效果如上圖所示。
由於二叉樹良好的形態包含了父節點和孩子節點的關係資訊,因此可以不使用連表而簡單的使用陣列來進行儲存。
實現堆的關鍵操作涉及到兩個關鍵函式,我們分別稱之為上溯函式與下溯函式。
siftup(i,x):將位置i的元素向上調整,以滿足堆的性質,常用於insert()之後,用於調整 堆;
siftdown(i,x):同理,常用於delete(i)之後,用於調整堆。
今天我們主要講述的是堆排序,在這裡只會用到下溯函式。下面給出小頂堆下溯函式的兩種實現方式:
<1>遞迴方式的實現
void sawp(int * a,int * b)
void ****down(int i,int size)
if(tem!=i)
****down(tem,size);
else return;
}
<2>非遞迴的實現方式:
void ****down(int i,int size)
void creath()
}void ****down(int i,int size)else break;
}num[i]=key;
}void sort()
}int main()
puts("隨機生成的陣列");
for(i=0;i
printf("%d ",num[i]);
puts("\n第一次建立堆後的陣列");
creath();
for(i=0;i
printf("%d ",num[i]);
puts("\n堆排序後的陣列:");
sort();
for(i=0;i
printf("%d ",num[i]);
return 0;
}
排序演算法學習之堆排序
堆排序 英語 heapsort 是指利用 堆這種資料結構所設計的一種 排序演算法 堆是乙個近似 完全二叉樹 的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。簡單的就是將乙個陣列看作是乙個二叉樹,然後每個父節點跟自己的子節點比較 最大的就成為父節點。如下圖 當第一輪對...
演算法學習 堆排序
一 關於二叉樹和堆的基本概念 1 二叉樹 每個節點,最多有2個子樹的數結構。左右子樹,也是最多有2個子節點。2 滿二叉樹 除最後一層外,每個節點都有2個子節點。3 完全二叉樹 存在的節點,和滿二叉樹的節點完全對應。4 堆 max heap 最大的元素永遠在根節點 任一非終端節點資料均不小於其左 右孩...
經典演算法學習 堆排序
堆排序是相對其他排序稍微麻煩的排序,是一種利用堆的性質進行的選擇排序。堆其實是一棵完全二叉樹,只要任何乙個非葉節點的關鍵字不大於或者不小於其左右孩子節點,就可以形成堆。堆分為大頂堆和小頂堆。由上述性質可知大頂堆的堆頂的關鍵字是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。堆排序同快速...