交換排序之堆排序

選擇排序

 

選擇排序(Selection Sort)的基本思想是:第i趟在剩餘的n-i+1中選擇第i小的記錄。其中最簡單的事簡單選擇排序(Simple Selection Sort)。

 

一、 簡單選擇排序:

如上文所述。

Void SelectionSort(intL[])

{

       For(i=1; I < L.length; ++i)

{

       J = 從i到L.length中選擇最小的記錄的位置

       If(i!=j)

              L[i]=L[j];

}

}

由上圖可知,選擇排序的主要操作在於比較,而不在於移動數據,所以優化方面主要應該減少比較次數,利用前n-1次的比較信息,就能有效地優化算法。

二、樹形選擇排序

從體育錦標賽中獲得靈感,如果在體育比賽中有三名參賽選手A、B、C、D,想要決出名次的話,需要進行三場比賽而非六場,沒有必要A與B\C\D都決出勝負,如果在決賽中A戰勝了D,即便A沒有與C戰鬥,那麼也可以認爲A是比C強的。

所以樹形選擇排序(Tree Selection Sort)又稱爲錦標賽排序(Tournament Sort),根節點是最小的節點。

建立一顆log2n+1的完全二叉樹,進行深度次的比較,所以時間複雜度爲O(nlogn)


三、堆排序

HeapSort需要記錄一個記錄大小的輔助空間。

在一個長爲n的的數組內,滿足第i個記錄小於等於第2i和第(2i+1)個記錄,則成爲最小堆,反之稱爲最大堆。

數組首個記錄爲最小值,由於爲完全二叉樹,所以每個父節點必有兩個子節點。

 

堆排序對記錄數比較少的文件不值得提倡,時間花費主要在建立初始堆和調整新堆時的反覆篩選上,所以在最壞的情況下,時間複雜度也爲O(nlogn),這是相對於快速排序來說,最大的優點。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章