演算法設計與分析 堆排序

2021-10-06 10:55:18 字數 1725 閱讀 7260

後記乙個高效的排序演算法,對整個計算機領域的貢獻都是極大的。在我看來,堆排序演算法就是這樣一種高效的排序演算法,它本身的設計就是非常巧妙的。

,等我以後寫了二叉樹分析的部落格再附上我自己的,嘿嘿。),一棵父節點元素一定大於等於子節點元素完全二叉樹(以上不是水字數,只是附上我的理解罷了)。

如上圖,看第二個,首先其根本不是一棵完全二叉樹,那麼也就不可能稱作是堆了。看第三個,包含元素5的節點,其子節點中,存在乙個包含元素6的節點,顯然不滿足堆的特性,也不是堆。綜上分析,只有第一棵樹可以稱作是堆

而堆排序呢,正是利用了堆的這些特性,故而稱作堆排序(怎麼聽起來有點拗口呢?不管了,就是這個意思就對了)。對於二叉樹,我們通常用陣列來進行儲存,稍微特殊一點的是,我們儲存位置的起始下標是1,不是0。那麼,這個時候我們就可以得出父節點和子節點的陣列下標之間的關係了。

那麼,給出我們乙個陣列,我們如何來構造乙個堆呢?我們正是利用的以上父子節點之間下標的關係來構造乙個堆。

在這裡,我們自底向上來構造堆(自頂向下的方法其實差不多,大家有興趣的可以研究研究)。

無論是最差還是最優的情況,堆排序的時間效率都屬於o(nlogn)。

分析如下:

這裡的c語言**,我仍然採用隨機數的生成來生成測試資料。

/*堆排序演算法——自底向上*/

#include

#include

/*利用全域性陣列 避免傳參*/

#define maxn 1000000

int arr[maxn]

;/*交換演算法*/

void

swap

(int i,

int j)

/*構造堆演算法*/

void

heapbottomup

(int n)

}/* 為保證向下交換的結果正確 將當前arr[k]的值賦予初值v 要知道 當前的k可能已經改變 */

arr[k]

= v;}}

/*排序總算法*/

void

heapsort

(int n)

}int

main()

/*呼叫堆排序演算法 傳參:陣列長度*/

heapsort

(n);

/*輸出結果*/

printf

("隨機長度:n=%d\n"

,n);

for(

int i=

1; i<=n; i++

)}

**執行示例如下:

排序演算法 堆排序演算法實現及分析

堆排序 heap sort 就來利用堆 假設利用大頂堆 進行排序的方法。它的基本思想是,將待排序的序列構成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走 其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的n 1個序列重新構造成乙個堆,這樣就會得到n個元素中的次小值...

演算法 排序 堆與堆排序

一 用陣列表示堆 堆其實是一棵完全二叉樹,那麼用陣列表示如下 二 大根堆 在完全二叉樹中任何一棵子樹的最大值都在根部 建立大根堆 public void creat int arr public static void heapinsert int arr,int index 整理大根堆 publi...

演算法設計與分析 氣泡排序

1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。3.針對所有的元素重複以上的步驟,除了最後乙個。4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。時間複雜度 若檔案...