演算法學習之 堆排序

2021-09-27 10:45:09 字數 1351 閱讀 4103

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 最大的元素永遠在根節點 任一非終端節點資料均不小於其左 右孩...

經典演算法學習 堆排序

堆排序是相對其他排序稍微麻煩的排序,是一種利用堆的性質進行的選擇排序。堆其實是一棵完全二叉樹,只要任何乙個非葉節點的關鍵字不大於或者不小於其左右孩子節點,就可以形成堆。堆分為大頂堆和小頂堆。由上述性質可知大頂堆的堆頂的關鍵字是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。堆排序同快速...