選擇排序,將一個序列看做兩個部分,前面有序,後面無序,每次在後面的無序序列中,選擇一個最小的元素,交換到前面有序序列的末尾,直到無序序列全部完成交換,即可完成排序
選擇排序是不穩定的排序算法
如何判斷一個排序算法是否穩定
- 如果一個待排序列中有多個相同的元素,經過排序後,它們的次序保持不變,則稱這種排序算法是穩定的
- (即假如有元素A = 5,B = 5,且 A 在 B 的前面,經過排序後,A 還在 B 的前面,則稱這種排序算法是穩定的)
基本思想:
- 第一次:從待排序的序列中選出最小的一個元素,存放在序列的起始位置
- 第二次:再從剩餘的未排序元素中尋找到最小元素,放到已排序的序列的末尾
- 以此類推,直到全部待排序的數據元素的個數爲零。
舉例分析:
有一個序列(5, 2, 0, 1, 3, 1, 4)
第一趟排序:
- 先選擇 5 爲最小的元素 min = 5
- 然後將它後面元素依次和最小元素min進行比較
- 2比 min 小,令 min = 2
- 0比 min 小,令 min = 0
- 1比 min 大,不處理
- 3比 min 大,不處理
- 1比 min 大,不處理
- 4比 min 大,不處理
- 此時的最小元素爲 min = 0
- 所以將它和 5 進行交換(0, 2, 5, 1, 3, 1, 4)
第二趟排序:
- 先選擇 2 爲最小的元素 min = 2
- 然後將它後面元素依次和最小元素min進行比較
- 5比 min 大,不處理
- 1比 min 小,令 min = 1
- 3比 min 大,不處理
- 1不比 min 小,不處理
- 4比 min 大,不處理
- 此時最小元素 min = 1
- 所以將它和 2 進行交換(0, 1, 5, 2, 3, 1, 4)
此時我們看到,經過兩趟排序,前面兩個元素 0, 1 已經是有序的了
所以我們只需重複執行上面的操作,直到後面元素都比較完爲止,即可完成排序
總的來說,就是每次在後面的無序序列中,選擇一個最小的元素,交換到前面有序序列的末尾,直到無序序列全部完成交換
動圖演示
Java代碼
package algorithm;
public class Sort {
// 選擇排序算法
public static void selectSort(int[] array) {
for (int i = 0 ; i < array.length - 1 ; i++) {
// 先令最小的元素的下標 等於 當前元素的下標
int minIndex = i;
// 然後尋找比當前元素還小的元素的下標
for (int j = i ; j < array.length ; j++) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
// 找到之後,進行交換
// 如果沒找到,則當前就是最小的,不用交換
if (minIndex != i) {
int temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
}
}
}
public static void main(String[] args) {
int[] array = new int[]{5, 2, 0, 1, 3, 1, 4};
Sort.selectSort(array);
// 打印數組
for (int i = 0 ; i < array.length ; i++) {
System.out.print(array[i] + " ");
}
}
}
時間複雜度
- 最好情況:O(n²),序列有序,無需進行交換,但仍需全部進行比較
- 平均情況:O(n²)
- 最壞情況:O(n²),序列逆序,需要全部進行比較,然後進行交換