選擇排序
選擇排序(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),這是相對於快速排序來說,最大的優點。