Data-structures-algorithms-bubble-sort-algorithm

提供:Dev Guides
移動先:案内検索

データ構造-バブルソートアルゴリズム

バブルソートは、単純なソートアルゴリズムです。 このソートアルゴリズムは比較ベースのアルゴリズムであり、隣接する要素の各ペアが比較され、要素が順序どおりでない場合は要素が交換されます。 このアルゴリズムは、平均および最悪の場合の複雑さがare(n ^ 2 ^)であるため、大きなデータセットには適していません。ここで、 n はアイテムの数です。

バブルソートの仕組み

この例では、ソートされていない配列を使用します。 バブルソートはΟ(n ^ 2 ^)時間かかるため、短く正確に保ちます。

バブルソート

バブルソートは最初の2つの要素から始まり、それらを比較してどちらが大きいかを確認します。

バブルソート

この場合、値33は14より大きいため、既にソートされた場所にあります。 次に、33と27を比較します。

バブルソート

27は33より小さく、これら2つの値を交換する必要があることがわかります。

バブルソート

新しい配列は次のようになります-

バブルソート

次に、33と35を比較します。 両方がすでにソートされた位置にあることがわかります。

バブルソート

次に、次の2つの値35と10に移動します。

バブルソート

そうすると、10が35より小さいことがわかります。 したがって、それらはソートされません。

バブルソート

これらの値を交換します。 配列の最後に到達したことがわかります。 1回の反復後、配列は次のようになります-

バブルソート

正確に言うと、各反復後に配列がどのように見えるかを示しています。 2回目の反復の後、それはこのように見えるはずです-

バブルソート

各反復の後、少なくとも1つの値が最後に移動することに注意してください。

バブルソート

また、スワップが不要な場合、バブルソートは配列が完全にソートされていることを学習します。

バブルソート

次に、バブルソートの実用的な側面を検討する必要があります。

アルゴリズム

*list* は *n* 要素の配列であると仮定します。 さらに、 *swap* 関数は、指定された配列要素の値を交換すると想定しています。
begin BubbleSort(list)

   for all elements of list
      if list[i] > list[i+1]
         swap(list[i], list[i+1])
      end if
   end for

   return list

end BubbleSort

疑似コード

アルゴリズム全体では、配列全体が昇順で完全にソートされていない限り、バブルソートは配列要素の各ペアを比較します。 これにより、すべての要素がすでに昇順であるため、配列でスワッピングが不要になった場合など、複雑な問題が発生する可能性があります。

問題を緩和するために、1つのフラグ変数 swapped を使用します。これは、スワップが発生したかどうかを確認するのに役立ちます。 スワップが発生していない場合、つまり 配列はソートするためにこれ以上の処理を必要とせず、ループから出ます。

BubbleSortアルゴリズムの擬似コードは次のように書くことができます-

procedure bubbleSort( list : array of items )

   loop = list.count;

   for i = 0 to loop-1 do:
      swapped = false

      for j = 0 to loop-1 do:

        /*compare the adjacent elements*/
         if list[j] > list[j+1] then
           /*swap them*/
            swap( list[j], list[j+1] )
            swapped = true
         end if

      end for

     /*if no number was swapped that means
      array is sorted now, break the loop.*/

      if(not swapped) then
         break
      end if

   end for

end procedure return list

実装

元のアルゴリズムとその即興の擬似コードで対処しなかったもう1つの問題は、反復ごとに最高値が配列の終わりに落ち着くことです。 したがって、次の反復には、既にソートされた要素を含める必要はありません。 この目的のために、実装では、ソート済みの値を回避するために内部ループを制限します。

Cプログラミング言語でのバブルソートの実装については、リンク:/data_structures_algorithms/bubble_sort_program_in_c [ここをクリック]をご覧ください。