
選擇排序,可以說是最簡單直覺的排序方法了。
一般來說選擇排序是将最小數字與第一(n)位進行交換,并重複這一過程;但是對于剛學習程式設計的人來說,如何寫出交換的過程,稍微有一些複雜。
下面先介紹一下更符合人類思考方式的方法,簡單的過程如下:
1.先把一組數字浏覽一遍,我們找出其中最小的數字
2. 在舊數組裡拿出來
3. 再放到一個新地方(數組)
這樣重複操作到每個數字,将所有數字都放到新數組,就從小到大排序完成了。
這裡還是用13個數字假裝成撲克牌進行示範
[3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
其實不用多說一眼就可以看明白,隻要重複排序過程(要排序的數字次),就排序完成啦。
下面寫一下關鍵代碼:
// 1.找出其中最小的數字min, 順便找到它的位置minIndex
let min = arr[0]
let minIndex
for (let i=1; i<arr.length; i++) {
if (arr[i] < min) {
min = arr[i]
minIndex = i
}
}
// 2.在舊數組裡拿出來
arr.splice(minIndex, 1)
// 在JavaScript中很簡單隻要用splice就可以了, 其他語言可能這一步要麻煩一點
// 3. 再将這個數字放到一個新數組
let sorted = []
sorted.push(min)
把這些步驟組合起來,重複執行13次(每個數字執行一次)即可完成排序:
let arr = [3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
let sorted = [] // 定義一個新地方放排序過的數字
let length = arr.length // 次數:每個數字都要排一次
for (let j=0; j<length; j++) {
let min = arr[0] // 這裡是步驟1
let minIndex
for (let i=1; i<length; i++) {
if (arr[i] < min) {
min = arr[i]
minIndex = i
}
}
arr.splice(minIndex, 1) // 步驟2
sorted.push(min) // 步驟3
console.log(arr) // 這裡輸出每一步可以清楚看到過程
console.log(sorted)
}
順便把比較常見的選擇排序寫下來:
let arr = [3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
let length = arr.length
for (let j=0; j<length; j++) { // 外側循環j确定要交換的數字位置
let min = arr[j]
let minIndex = j // minIndex需要設定預設最小值位置
for (let i=j; i<length; i++) { // 内層循環找出j之後最小數字的位置
if (arr[i] < min) {
min = arr[i]
minIndex = i
}
}
[arr[j], arr[minIndex]] = [arr[minIndex], arr[j]] // 這裡進行數字交換,也可以使用其他方法
console.log(arr)
}
當然選擇排序也有很多優化的方法,比如再循環中‘我拿大,你拿小’就可以減少一半過程,但是由于這個排序很少用到,隻要領會思想就夠了,以後有機會再寫。