データ構造とアルゴリズム-C / C ++はバブルソート(バブルソート)アルゴリズムを実現します[推奨コレクション]

1.バブルソートの概要

バブルソート。バブルソートまたはバブルソートとも呼ばれます。これは比較的単純なソートアルゴリズムです。いくつかの二次的な数字のシーケンスをトラバースします。トラバースするたびに、2つの隣接する数字のサイズを前から後ろに比較します。前者が後者よりも大きい場合は、位置を交換します。このように、トラバーサルの後、最大の要素はシーケンスの最後にあります!同じ方法で再度移動する場合、2番目に大きい要素が最大の要素の前に配置されます。シーケンス全体が整うまで、この操作を繰り返します。

編集者は私自身のlinuxC / C ++言語技術交換グループを推奨しています:[ 1106675687 ]グループファイルで共有する方が良いと思う学習本とビデオ資料をいくつかまとめました。必要に応じて追加できます。

2、バブルソートのグラフィックの説明

2.1バブルソートCの実装1

void bubble_sort1(int a[], int n)
{
    
    
    int i,j;

    for (i=n-1; i>0; i--)
    {
    
    
        // 将a[0...i]中最大的数据放在末尾
        for (j=0; j<i; j++)
        {
    
    
            if (a[j] > a[j+1])
                swap(a[j], a[j+1]);
        }
    }
}

シーケンス{20,40,30,10,60,50}を例として取り上げて、バブルソートプロセスを示しましょう(下の図を参照)。
ここに画像の説明を挿入
最初のパスの並べ替えを分析してみましょう
。i= 5、j = 0、a [0] <a [1]の場合。現時点では、何もしないでください。
i = 5およびj = 1の場合、a [1]> a [2]。このとき、a [1]とa [2]の値を交換します。交換後、a [1] = 30とa [2] = 40になります。
i = 5およびj = 2の場合、a [2]> a [3]。このとき、a [2]とa [3]の値を交換します。交換後、a [2] = 10とa [3] = 40になります。
i = 5およびj = 3の場合、a [3] <a [4]。現時点では、何もしないでください。
i = 5およびj = 4の場合、a [4]> a [5]。このとき、a [4]とa [5]の値を交換します。交換後、a [4] = 50とa [3] = 60になります。

したがって、最初のパスがソートされた後、シーケンス{20,40,30,10,60,50}は{20,30,10,40,50,60}になります。このとき、シーケンスの最後の値が最大になります。

この方法によると
、2番目のパスがソートされた、シーケンス内のa [5 ... 6]が順序付けられます。
3番目のパスがソートされた後、シーケンス内のa [4 ... 6]が順序付けられます。
4番目のパスがソートされた後、シーケンス内のa [3 ... 6]が順序付けられます。
5番目のパスがソートされた後、シーケンス内のa [1 ... 6]が順序付けられます。

5回目のソートの後、シーケンス全体が順序付けられます。

2.2バブルソートCの実装2

上記のバブルソートのフローチャートを確認してください。3回目のパスのソート後、データはすでに順番になっています。4回目のパスと5回目のパスは交換されません。次に、バブルソートを最適化して効率を高めます。トラバーサル中にスワップが発生した場合はマーカーを追加し、それ以外の場合はfalseを追加します。ある旅行で交換がない場合は仕分け完了です!

void bubble_sort2(int a[], int n)
{
    
    
    int i,j;
    int flag;                 // 标记

    for (i=n-1; i>0; i--)
    {
    
    
        flag = 0;            // 初始化标记为0

        // 将a[0...i]中最大的数据放在末尾
        for (j=0; j<i; j++)
        {
    
    
            if (a[j] > a[j+1])
            {
    
    
                swap(a[j], a[j+1]);
                flag = 1;    // 若发生交换,则设标记为1
            }
        }

        if (flag==0)
            break;            // 若没发生交换,则说明数列已有序。
    }
}

第三に、バブルソートの時間計算量と安定性

バブルソートの時間計算量

バブルソートの時間計算量はO(N2)です。ソートされているシーケンスにN個の番号があるとします。トラバーサルの時間計算量はO(N)です。トラバーサルはいくつ必要ですか?N-1回!したがって、バブルソートの時間計算量はO(N2)です。

バブルソートの安定性

バブルソートは安定したアルゴリズムであり、安定したアルゴリズムの定義を満たしています。アルゴリズムの安定性-シーケンスにa [i] = a [j]があると仮定します。ソート前の場合、a [i]はa [j]の前にあり、ソート後、a [i]はまだa [j]の前にあります。そうすれば、このソートアルゴリズムは安定しています!

編集者は私自身のlinuxC / C ++言語技術交換グループを推奨しています:[ 1106675687 ]グループファイルで共有する方が良いと思う学習本とビデオ資料をいくつかまとめました。必要に応じて追加できます。
ここに画像の説明を挿入

第四に、バブルソートの実装

バブルソートCの実装
実装コード(bubble_sort.c)

 View Code

バブルソートC ++実装
実装コード(BubbleSort.cpp)

 View Code

バブルソートJava実装
コード(BubbleSort.java)

View Code

上記の3つの実装の原理と出力結果は同じです。それらの出力は次のとおりです。

before sort:20 40 30 10 60 50 
after  sort:10 20 30 40 50 60

おすすめ

転載: blog.csdn.net/m0_50662680/article/details/112949416