選擇排序(Selection sort)是一種簡單直觀的排序算法。它在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。以此類推,直到全部元素均排序完畢。html
選擇排序的比較次數爲 n(n-1)/2,比較次數O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+...+1=n*(n-1)/2。git
交換次數介於0和(n-1)次之間,交換次數O(n)。最好狀況是,已經有序,交換0次;最壞狀況交換n-1次,逆序交換n/2次。github
賦值操做介於 0 和 3 (n - 1) 次之間。算法
故而在最優、最壞和平均狀況下,其時間複雜度爲 O(n^2)。數據結構
選擇排序過程當中,須要臨時變量存儲待排序元素,所以空間複雜度爲O(1)。性能
選擇排序是不穩定的算法,在選擇數值和交換過程當中它們的順序可能會發生變化。學習
能歸位,每一趟排序有一個元素歸位。動畫
public int[] selectionSort(int[] sourceArray){ int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); // 總共要通過 N-1 輪比較
for (int i = 0; i < arr.length - 1; i++) { int min = i; // 每輪須要比較的次數 N-i
for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { // 記錄目前能找到的最小值元素的下標
min = j; } } // 將找到的最小值和i位置所在的值進行交換
if (i != min) { int tmp = arr[i]; arr[i] = arr[min]; arr[min] = tmp; /* 另外一種交換方法 arr[min] = arr[min]^arr[i]; arr[i] = arr[min]^arr[i]; arr[min] = arr[min]^arr[i]; */ } } return arr; }