選擇排序(Selection sort)跟插入排序一樣,也是O(n^2)的復雜度,這個排序方式也可以用我們的撲克牌來解釋。
概念
桌面上有一堆牌,也是雜亂無章的,現在我們想將牌由小到大排序,如果使用選擇排序來做,應該是這樣來做。
- 遍歷桌面牌堆里的牌,從第一張牌到最后一張,找到牌面最小的一張,然后將抽出,並扣在手上。
- 第二次遍歷桌面牌堆里的牌,從第一張牌到最后一張,仍然去找現在桌面上牌面最小的一張,找出來,還是扣在手上。
- 第三次遍歷……重復步驟。雖然桌面上的牌是無序的,但是我們扣在手上的牌是有序的。
- 第N次遍歷……重復直到結束,現在桌面上沒有牌,所有的牌都抓在手里,而且手上的牌全是排序排好的。
這個過程就是選擇排序。
偽代碼 - SelectionSort(seq)
n = seq.length
for j=1 to n-1
smallest = j
for i = j+1 to n
if seq[i] < seq[smallest]
smallest = i
exchange seq[j] with seq[smallest]
注:
j=1指的是第一個元素,即我們常常的seq[0]。
套用一種語言來實現算法。
Python版
def sort(seq):
n = len(seq)
for j in range(n - 1):
smallest = j
for i in range(j + 1, n):
if seq[i] < seq[smallest]:
smallest = i
if smallest != j:
seq[j], seq[smallest] = seq[smallest], seq[j]
return seq
Python版源碼:Github-Syler-Fun-Selectionsort-Python
Java版
public static int[] sort(int[] seq)
{
int n = seq.length;
for(int j = 0; j < n - 1; j++){
int smallest = j;
for(int i = j + 1; i < n; i++){
if(seq[i] < seq[smallest]){
smallest = i;
}
if(smallest !=j) {
int temp = seq[smallest];
seq[smallest] = seq[j];
seq[j] = temp;
}
}
}
return seq;
}
Java版源碼:Github-Syler-Fun-Selectionsort-Java
看起來還是Python寫起來比較短一點呢。