選擇排序 【SelectionSort】
阿新 • • 發佈:2019-02-08
選擇排序
假設初始的陣列是[5,4,7,2]
以從小到大排序為例,我們可以將陣列分為兩個區域,一個是無序區,一個是有序區,在一開始所有的資料都在無序區。
- 進行第一輪排序,對無序區的陣列[5,4,7,2]進行遍歷,記錄最小值2,然後將它與第0個元素進行位置交換。此時無序陣列
[4,7,5]
,有序陣列[1]
,原本的陣列[1,4,7,5]
- 進行第二輪排序,對無序區的陣列[4,7,5]進行遍歷,記錄最小值4,然後將它與第1個元素進行位置交換。當然自己本身就處於第一個元素的位置,所以可以不變,此時無序區陣列
[7,5]
,有序陣列[1,4]
,原本的陣列[1,4,7,5]
- 進行第三輪排序,對無序區陣列[7,5]進行遍歷,記錄最小值5,然後將它與第2個元素進行位置交換。此時陣列
[2,4,,5,7]
總結:
1. 每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置
2. 重複一過程
演算法實現
public class SelecitionSort {
public void selectionSort(int[] arr) {
if(arr == null || arr.length == 1) {
return ;
}
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
時間複雜度
需要進行n-1次排序(n為陣列長度),每一次排序需要進行n-i次比較(i為當前第幾次排序)。所以時間複雜度為 O(N^2)
即使考慮了初始化資料的情況,時間複雜度也是O(N^2)
, 只是需要交換的次數為0,最壞的情況會交換n-1次。
穩定性
選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法。