選擇排序法是經典的三大 O(n^2) 排序演算法之一。所謂的「選擇」是要在未排列序列中最小(大)的物件,將其放置到已排列序列的末端。(一個序列可分為兩段,已排序和未排序),重複此動作最後就能完成排序。
雖然會說選擇排序法有一個優點是最壞狀況的「交換」次數是 n - 1 次,在交換位置的時間比比較大得多的情況下,故若數列接近反序,選擇排序法會比冒泡排序法跟選擇排序法來得有效率,但實際上在實作時是錯的。由於尋找最小值時就會不斷需要記住最小值的索引,會一直進行賦值操作,故在實際使用上(測試過整數完全反序數列排序),插入排序法效率遠比選擇排序法來得高。
複雜度:
- 時間:最佳 O(n^2) 最差 O(n^2)
- 空間:O(n), O(1) 輔助
步驟:
- 將序列視為兩段,已排序和未排序,一開始整個數列都算未排序。
- 從未排序序列的頭開始向後尋找最大(小)的物件。
- 將其與未排序數列的頭交換 (也就是將這個物件放到已排序數列的尾端)。
- 重複此步驟2~3,直到整個數列都變成已排序數列。
Java 簡單實現:
public class SelectionSort { public void sort(int[] array) { // 未排序數列的頭 for(int i = 0; i < array.length; ++i) { int min = i; // 向後找最大(小) for(int j = i + 1; j < array.length; ++j) { if(array[j] < array[min]) { min = j; } } // 和頭交換 int tmp = array[i]; array[i] = array[min]; array[min] = tmp; } } }
範例影片:
參考資料:
沒有留言:
張貼留言
部落格是發表個人言論的地方,歡迎您給留言來進行討論與給予指教,但也希望您以理性開放的態度來看待文章內容,如果我也會尊重您的留言一般。謝謝