js帶註釋的氣泡排序演算法

播种者發表於2024-04-17

一、簡述
氣泡排序(Bubble Sort)是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果二者的順序(如從大到小、首字母從A到Z)錯誤就交換。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法名字的由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“氣泡排序”。

第一種:常規方法氣泡排序

比較相鄰的兩個元素,如果前一個比後一個大,則交換位置。
第一輪把最大的元素放到了最後面。
由於每次排序最後一個都是最大的,所以之後按照步驟1排序最後一個元素不用比,最理想的情況是已經按順序排好的佇列,只需要掃描一次就結束並且不需要做任何位置交換,複雜度為O(n); 最差為O(n2)

function bubbleSort(data){

  if(data.length<1) return data;

  let n = data.length;

  for(let i=0;i<n;i++){

    //因為掃描完一次後,最後一個不用比了,所以要n-i進行邊界處理,達到最佳化效能目的

    for(let j=0;j<n-i; j++){
      if(data[j]>data[j+1]){

        // 交換函式
        let swap = data[j];

        data[j] = data[j+1];

        data[j+1] = swap;

      }

    }
  }

  return data;

}

第二種: 對氣泡排序的改進

宣告一個變數標記順序是否發生變化

function bubbleSort(data){
  let n = data.length;

  let flag = true

  let swap

  // 只要存在位置更換就進入迴圈

  while(flag){

    flag = false

    // 每次排序最後一個都是最大的, 所有迴圈結束後,就得到了升序佇列。

    for(let i=0;i<n;i++){
     if(data[i]>data[i+1]){

       // 交換函式

       swap = data[i]

       data[i] = data[i+1]
       data[i+1] = swap;

       flag = true;

     }

    }

    // /因為掃描完一次後,最後一個不用比了,所以要n--進行邊界處理,達到最佳化效能目的

    n--;

  }

  return data;
}

第三種: 也是對氣泡排序的一種改進

第一遍排序時將資料分成兩部分,一部分比另一部分的所有資料都要小。然後遞迴呼叫,在兩邊都實行排序。

function bubbleSort(data) {

  // 佇列只有一個數或者沒有數,返回原佇列
  if(data.length <= 1) {
    return data
  }
  // 在佇列中向取整,找到一個理論上的中間值索引
  let pIndex = Math.floor(data.length/2)

  // 從原佇列中刪除該中間值,並且取出該值。
  let p = data.splice(pIndex, 1)[0]

  // 小於中間值的左邊部分
  let left = []

  // 大於中間值的右邊部分
  let right = []

  // 透過掃描已經刪除了中間值的佇列,分別得到小於中間值的左邊部分和大於中間值的左邊部分
  for(var i = 0; i<data.length; i++) {
    if(data[i] < p) {
      left.push(data[i])
    } else {
      right.push(data[i])
    }
  }
  // 分別遞迴左邊,右邊
  let nLeft = bubbleSort(left);
  let nRight = bubbleSort(right)

  // 返回新的佇列
  return nLeft.concat([p], nRight);
}

相關文章