JavaScript——冒泡排序和選擇排序詳解

冒泡排序:比較相鄰兩個項,若 第一個項 大於 第二個項,那麼交換他們,元素向上移動一次,直到遍歷結束。javascript

來實現一下java

function bubbleSort(arr) {
  // 提早存儲數組的長度 避免每次遍歷都讀這個值
  let { length } = arr
  // 開始一個外層循環,表明每次取下標爲 i 的元素做爲第一項 
  for (let i = 0; i < length; i++) {
    // 開始一個內循環,表明每次取下標爲 j 的元素做爲第二項; 直至內循環迭代完,外循環迭代一次,再進入內循環迭代一輪, 首次跳過第一項
    for (let j = 0; j < length - 1; j++) {
      // 內循環在迭代的過程當中,若發現有比下標爲 i 還小的元素 ,則對他們進行調換
      if (arr[i] < arr[j]) {
        // let temp = arr[j]
        // arr[j] = arr[j + 1]
        // arr[j + 1] = temp  //經典方式 es5 以前 👇
        [arr[i], arr[j]] = [arr[j], arr[i]] // 這個是 es6以後 解構賦值寫法 
      }
    }
  }
  return arr
}

console.log(bubbleSort([11, 423, 534, 1223, 5345, 745, 73, 123]))      // 輸出 [11, 73, 123, 423, 534, 745, 1223, 5345]

下面這個示意圖展現了改進後的冒泡排序算法是如何執行的。es6

注意,已經在正確位置上的數字沒有被比較。即使咱們作了這個小改變來改進冒泡排序算法,
但仍是不推薦該算法,它的複雜度是O(n2)。算法

選擇排序:選擇排序的思路大體是,找到數據結構中最小的,放到第一位;找到第二小的,放到第二位··· 以此類推
來實現一下選擇排序數組

function selectionSort(arr){
   const {length} = arr
   let indexMin 
   // 開始一個內循環,從第 i 個下標開始;因爲老是從 0 開始,**因此第一輪在尋找的是 最小的值,並要將找到的值放入第一位;此後的每輪都是再找 第 i 大的值 ,並放入第 i 位**
   for(let i = 0;i<length - 1; i++){
      // 假設第 i 大的值爲 i ,並約定一個變量存儲
      indexMin = i
      // 開始一個內循環,從第 i 個下標開始
      for(let j = i; j < length; j++){
         if(arr[i]>arr[j]){
            // 若下標爲 i 的元素大於下標爲 j 的元素,那麼將** j **下標賦值給**約定的變量**
            indexMin = j
         }
      }
      // 結束一輪循環, 判斷下標i和indexMin是否爲相等 若不相等才進行交換;此舉能夠跳過第一個元素 與 第一個元素的比較
      if(i !== indexMin){
         [ arr[i],arr[indexMin] ] = [ arr[indexMin],arr[i] ]
      }
   }
   return arr
}
array = selectionSort([11, 423, 534, 1223, 5345, 745, 73, 123])       // 11,73,123,423,534,745,1223,5345
console.log(array.join())

下面的示意圖展現了選擇排序算法,以selectionSort([5, 4, 3, 2, 1])爲例子數據結構

另外推薦一個網站 能夠經過動圖來展現這個過程
https://visualgo.net/zh/sorting網站

相關文章
相關標籤/搜索