天天看點

撲克牌排序_簡單的算法(2)--選擇排序

撲克牌排序_簡單的算法(2)--選擇排序

選擇排序,可以說是最簡單直覺的排序方法了。

一般來說選擇排序是将最小數字與第一(n)位進行交換,并重複這一過程;但是對于剛學習程式設計的人來說,如何寫出交換的過程,稍微有一些複雜。

下面先介紹一下更符合人類思考方式的方法,簡單的過程如下:

1.先把一組數字浏覽一遍,我們找出其中最小的數字

2. 在舊數組裡拿出來

3. 再放到一個新地方(數組)

這樣重複操作到每個數字,将所有數字都放到新數組,就從小到大排序完成了。

這裡還是用13個數字假裝成撲克牌進行示範

[3, 6, 12, 7, 5, 1, 13, 8, 10, 2, 4, 9, 11]
撲克牌排序_簡單的算法(2)--選擇排序

其實不用多說一眼就可以看明白,隻要重複排序過程(要排序的數字次),就排序完成啦。

下面寫一下關鍵代碼:

// 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)
}
           

當然選擇排序也有很多優化的方法,比如再循環中‘我拿大,你拿小’就可以減少一半過程,但是由于這個排序很少用到,隻要領會思想就夠了,以後有機會再寫。