選擇排序是一種簡單直觀的排序算法,無論什么數據進去都是 O(n2) 的時間復雜度。所以用到它的時候,數據規模越小越好。唯一的好處可能就是不占用額外的內存空間了吧。
選擇排序算法步驟:
- 首先在未排序序列中找到最小元素,與第一個元素進行交換,讓最小的元素在排序最前面。
- 再從剩余未排序n-1個元素中繼續尋找最小元素,然后與第二個元素交換位置。
- 重復第二步,第N-1趟遍歷剩下的2個數據,找出其中最小的數值與第N-1個元素交換,至此選擇排序完成。
以下面5個無序的數據為例:
56 12 80 91 20(文中僅細化了第一趟的選擇過程)
-
第1趟:12 56 80 91 20
第一趟對比過程.png - 第2趟:12 20 80 91 56
- 第3趟:12 20 56 91 80
- 第4趟:12 20 56 80 91
let arr = [56, 12, 80, 91, 20];
function selectSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[i]) {
let temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
console.log(arr)
}
return arr;
}
console.log(selectSort(arr)) // [ 12, 20, 56, 80, 91 ]
平均時間復雜度:O(n2)
空間復雜度:O(1) (用于交換和記錄索引)
穩定性:不穩定 (比如序列【5, 5, 3】第一趟就將第一個[5]與[3]交換,導致第一個5挪動到第二個5后面)
排序前:56,12,80,91,20
排序中!!調整:12,56,80,91,20
排序中!!不調整:12,56,80,91,20
排序中!!不調整:12,56,80,91,20
排序中!!不調整:12,56,80,91,20
排序后:12,56,80,91,20
-------------------
排序前:12,56,80,91,20
排序中!!不調整:12,56,80,91,20
排序中!!不調整:12,56,80,91,20
排序中!!調整:12,20,80,91,56
排序后:12,20,80,91,56
-------------------
排序前:12,20,80,91,56
排序中!!不調整:12,20,80,91,56
排序中!!調整:12,20,56,91,80
排序后:12,20,56,91,80
-------------------
排序前:12,20,56,91,80
排序中!!調整:12,20,56,80,91
排序后:12,20,56,80,91
-------------------
最終結果:12,20,56,80,91
image.png