バブルソート


バブルソートは、配列をソートするための効率の欠如のため、単に最も広く議論されたアルゴリズムの一つです.配列が既にソートされている場合、バブルソートは1回だけ配列を通過します(ただし、以下の概念を使用します)しかし、最悪の場合のシナリオはO(nの)の実行時間です.
バブルソートの前大統領バラクオバマも.
o(n←)の成長率をグラフ化するとき,o(n log n)であるmerge sortのような他のソートアルゴリズムと比較して,それはより速いスケールで成長することを示した.

バブルソートである残虐性を考えれば、アルゴリズムを理解し、それがなぜ貧しいのかを解読することはまだ重要です.
バブルソートをコーディングするための2つの概念を調べましょう.

コンセプト1
  • 配列を反復し、各要素を配列の次の要素に対してチェックします.
  • 現在の要素が次の要素より大きい場合、それらを交換します.
  • もしそうでなければ、ポインタを動かし、次の2つの要素を比較します.
  • 配列の最後に到達したら、最大の要素が最後の位置にあることを知っています.
  • このプロセスをn回繰り返し、nが配列の長さであり、毎回、最後のソートされた要素まで繰り返します.

  • 概念1の可視化
    これがどのように長さ6の配列で実行されるかを見てみましょう.


    コンセプトコード
    コンセプトの1つに2つのポインタ(2つの入れ子になったループ)が必要です.我々が反復するたびに、このインデックスがソートされた値を含むということを知っているように、上限は1によって減少します.
    function bubbleSortConcept1(arr) {
      for (let j = arr.length - 1; j > 0; j--) {
        for (let i = 0; i < j; i++) {
          if (arr[i] > arr[i + 1]) {
            let temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
          }
        }
      }
    }
    

    コンセプト2
  • 配列を反復し、各要素を配列の次の要素に対してチェックします.
  • 現在の要素が次の項目より大きい場合、それらを交換します.
  • はスワップが起こったことを示します.
  • スワップが発生した場合、再度ループをループします.
  • 私たちは、スワップが発生しなかったときに配列がソートされることを知っています.


  • コンセプト2コード
    スワップが発生したかどうかを示すブール値を格納するために変数を使用しているため、このメソッドを使用するポインタは1つだけ必要です.概念1とは対照的に、この概念は、私たちがそれを通過するたびに、配列の各項目を繰り返すことを要求します.
    function bubbleSortConcept2(arr) {
      let swapped;
    
      do {
        swapped = false;
        console.log(arr);
        arr.forEach((item, index) => {
          if (item > arr[index + 1]) {
            // Save the value to a variable so we don't lose it
            let temp = item;
            arr[index] = arr[index + 1];
            arr[index + 1] = temp;
            swapped = true;
          }
        })
      } while (swapped);
    }
    

    実行時間
    バブルソートはo(n≧)で最も効率的なソートアルゴリズムの一つです.最悪の場合、配列内のすべての要素に対して各要素を比較する必要があります.