ES6算法---選擇排序 Selection Sort

原理:每一次內循環遍歷尋找最小數的下標min,並在這次內循環結束後交換 min 和 j 的位置。

時間複雜度

  • 最優時間複雜度:O(n2)
  • 最壞時間複雜度:O(n2)
  • 穩定性:不穩定
function selection_sort(arr) {
  let len = arr.length
  for (let j = 0; j < len-1; j++) {
    let min = j
    for (let i = j + 1; i < len; i++) {
      if (arr[min] > arr[i]) {
        min = i
      }
    }
    if (min !== j) {
      [arr[min], arr[j]] = [arr[j], arr[min]]
      // console.log(arr)
    }
  }
}
let arr = [7, 4, 3, 67, 34, 1, 8]
selection_sort(arr) // [ 1, 3, 4, 7, 8, 34, 67 ]

解析:將每一次外循環的值,和內循環中的值依次比較,如果在內循環中找小於自己的值,就將min這個下標指向內循環中的較小值的下標,之後在循環中比較較小值和下一個值,最後找到內循環中最小值的下標,內循環結束後將內循環最小值和外循環值交換。
循環參數: 外循環: 0–>n-2, 內循環:j+1–>n-i

這裏解釋下爲什麼這種排序是不穩定的,假設一個數組有重複數

let arr = [1, '4', 3, 67, 34, 4, 7, 8] // `4`和4完全相同,加引號是爲了說明方便

取最小值:[1, 3, '4', 4, 7, 8, 34,  67]
取最大值:[ 67, 34, 8, 7, '4', 4, 3, 1] 翻轉後-->[1, 3, 4, '4', 7, 8, 34,  67]

聰明你發現了嗎,兩種排序後重復值4位置竟然發生了改變,所以這種算法是不穩定的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章