01.2-選擇排序
阿新 • • 發佈:2020-07-22
目錄
1、簡介
選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序畢。
2、程式碼
public class SelectionSort { public static void sort(Comparable[] arr){ int n = arr.length; for(int i = 0; i < arr.length; i++){ int minIndex = i; for(int j = i+1; j < n; j++) if(less(arr[j], arr[minIndex])) minIndex = j; swap(arr, i, minIndex); } } private static boolean less(Comparable a, Comparable b){ return a.compareTo(b) < 0; } private static void swap(Comparable[] arr, int a, int b){ Comparable temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; } }
3、測試
public static void main(String[] args) { // 測試Integer int n = 10000; Integer[] arr = SortTestHelper.generateRandomArray(n, 0, 10000); SelectionSort.sort(arr); SortTestHelper.printArray(arr); System.out.println(); SortTestHelper.testSort("Ⅰ_sorting_basic.Ⅰ_selection_sort.SelectionSort", arr); // 測試自定義型別,類需要實現Comparable介面 }
4、複雜度分析
選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n(n - 1) / 2 次。選擇排序的賦值操作介於 0 與 3(n - 1) 次之間。所以總體上來說,時間複雜度為 O(n2) 。
比較次數 O(n2),比較次數與關鍵字的初始狀態無關,總的比較次數 N = (n -1) + (n - 2) + ... + 1。
交換次數 O(n),最好情況是,已經有序,交換0次;最壞情況是,逆序,交換 n - 1 次。交換次數比氣泡排序較少,由於交換所需CPU時間比比較所需的CPU時間多,n 值較小時,選擇排序比氣泡排序快。
原地操作幾乎是選擇排序的唯一優點,當空間複雜度要求較高時,可以考慮選擇排序;實際適用的場合非常罕見。
複雜度 | |
---|---|
平均時間複雜度 | О(n²) |
最壞時間複雜度 | О(n²) |
最優時間複雜度 | О(n²) |
空間複雜度 | 總共О(n),需要輔助空間O(1) |
最佳解 | 偶爾出現 |