データ構造:一般的な並べ替えアルゴリズム(1):バブル並べ替え(C ++実装)

バブルソートの一般的なソート

1.基本的な考え方:

並べ替える一連の番号で、現在並べ替えられていない範囲内のすべての番号について、隣接する2つの番号を上から下に比較して調整し、大きい方の番号が沈むようにします。小さな子たちが上がっています。

2.アルゴリズムの説明:

①2つの隣接する番号を比較し、それらの順序が順序要件に反していることが判明した場合、それらは交換されます。隣接する2つの数値を順番に比較し、10進数を前面に、大きい数値を背面に配置します。

②まず、1番目と2番目の数字を比較し、前に10進数を入れ、後ろに大きな数字を入れ、次に2番目と3番目の数字を比較し、大きな数字の前後に10進数を入れて、比較が終わるまでこのように続けます。 2つの数値の場合、大きい数値の前に10進数を置きます。

③すべての並べ替えが完了するまで、最初の手順を繰り返します。

3.例:

例1:

(1)配列をソートするには:[10,1,35,61,89,36,55]

ここに写真の説明を挿入

(2)最初の時系列:

最初の並べ替え:10と1、10は1より大きい、交換位置[1,10,35,61,89,36,55]

ソートの第2ラウンド:10と35を比較します。10は35未満であり、位置を入れ替えないでください[1,10,35,61,89,36,55]

ソートの第3ラウンド:35と61を比較します。35は61未満であり、位置を入れ替えないでください[1,10,35,61,89,36,55]

ソートの第4ラウンド:61と89を比較します。61は89未満であり、位置を入れ替えないでください[1,10,35,61,89,36,55]

5回目のパスソート:89と36を比較します。89は36より大きく、位置を交換します[1,10,35,61,36,89,55]

6番目の時系列:89と55を比較します。89は55より大きく、位置を交換します[1,10,35,61,36,55,89]

最初の旅行で合計6つの比較が行われ、並べ替えられた結果:[1,10,35,61,36,55,89]

img

(3)2番目の時系列:

最初の並べ替え:1と10が比較され、1は10未満であり、位置1,10,35,61,36,55,89は交換されません。

2番目のソート:10と35の比較、10は35未満、位置を交換しない1,10,35,61,36,55,89

3番目の順序:35と61の比較、35は61未満、位置を交換しない1,10,35,61,36,55,89

4番目の順序:61と3​​6を比較します。61は36より大きく、位置を交換します1,10,35,36,61,55,89

5次:61と55を比較、61は55より大きい、交換位置1,10,35,36,55,61,89

2回目のパスで合計5つの比較が行われ、並べ替えられた結果:1,10,35,36,55,61,89

(4)3番目の時系列:

1と10が比較され、1は10未満であり、位置は交換されません1,10,35,36,55,61,89

2番目の順序:10と35の比較、10は35未満、位置を交換しない1,10,35,36,55,61,89

3番目の順序:35と36の比較、35は36未満、位置を交換しない1,10,35,36,55,61,89

4番目の順序:36と61を比較します。36は61未満であり、位置1,10,35,36,55,61,89を交換しません。

第3ラウンドでは、合計4つの比較が行われ、ソートされた結果:1,10,35,36,55,61,89

これまでのところ、位置はすでに整然としています。

C ++コードの実装:

#include<iostream>
using namespace std;
 
void print(int arr[], int n)
{  
    for(int j= 0; j<n; j++)
	{  
           cout<<arr[j] <<"  ";  
        }  
    cout<<endl;  
}  
 
void BubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++)
	{
            for (int j = 0; j < n - i - 1; j++)
	        {
                    if (arr[j] > arr[j + 1]) 
			{
                            int temp = arr[j];
                            arr[j] = arr[j + 1];
                            arr[j + 1] = temp;
                        }
                 }
         }
}
 
int main()
{  
    int s[7] = {10,1,35,61,89,36,55};  
    cout<<"初始序列:";  
    print(s,7);  
    BubbleSort(s,7);  
    cout<<"排序结果:";  
    print(s,7);  
    system("pause"); 
} 

例2:

並べ替え配列:[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]

最初の例ではすでにプロセスが説明されているため、2番目の例の並べ替えを次の動的図に示します。

img

4.アルゴリズム分析:

(1)次のことがわかります:N個の番号を並べ替える必要があり、合計N-1個のパスが並べ替えられ、各iパスの並べ替え回数は(Ni)回であるため、二重ループステートメントを使用できます。外側のレイヤーはループの回数を制御し、内側のレイヤーはループの回数を制御します。パスごとのサイクル数を制御する

(2)バブルソートの利点:ソートが実行されるたびに、より大きな値が見つかるため、ソートが実行されるたびに比較が少なくなります。上記の例のように、最初のパスの後、最後の番号が最大の番号である必要があります.2番目のパスを並べ替えるときは、最後の番号以外の他の番号を比較するだけで、最大の番号を見つけることもできます。の数は、2回目の比較に参加した数の後ろにランク付けされます。3回目の比較では、最後の2つの数を除く他の数を比較するだけで済みます。つまり、毎回比較はありません。 1回の旅行で比較する回数が少ないと、アルゴリズムの量がある程度減少します。

(3)時間の複雑さ

1.データが正の順序である場合、並べ替えを完了するために1回の旅行を行うだけで済みます。必要な比較の数Cと記録された移動の数Mは両方とも最小に達します。つまり、Cmin = n-1; Mmin = 0;したがって、バブルソートに最適な時間の複雑さはO(n)です。

2.残念ながら、データの順序が逆の場合は、n-1回並べ替える必要があります。各並べ替えにはni回の比較(1≤i≤n-1)が必要であり、各比較では、交換レコードの位置に到達するためにレコードを3回移動する必要があります。この場合、比較と移動の数は最大に達します。

img

要約すると、バブルソートの合計平均時間複雑度は次のとおりです。O(n 2)、時間複雑度はデータステータスとは関係ありません。要約すると、バブルソートの合計平均時間複雑度はO(n ^ 2)であり、時間複雑度はデータステータスとは関係ありません。完全前記テイク気泡排出配列合計平坦な平均時間の間にヘテロアリール度があるO N-2ときの複雑なヘテロ多数のデータがな条件をせずにクリアランス

5.要約:

  • 最悪の場合:バブリングソートにはn-1ラウンドのソートサイクルが必要です。ソートサイクルの各ラウンドでは、シーケンスが正の順序ではないため、ソートサイクルの各ラウンドでniの比較(1 <= i <= n-1)が必要です。 、つまり、外側のループはn-1回実行され、内側のループは最大n回実行され、内側のループは少なくとも1回実行されます。内側のループの実行時間は線形であるため、内側のループは平均(n + 1)/ 2回実行され、時間の複雑さが計算されます。 ((n-1)(n + 1))/ 2 =(-1)/ 2の場合、時間の複雑さはO(n2)です。

  • 最良の場合:ソートされる配列は正の順序であり、ソートは1回のスキャンで完了できます。現時点では、時間の複雑さは比較の時間の複雑さ、つまりO(n)のみです。

  • 平均時間の複雑さ:O(n 2)平均時間の複雑さ:O(n ^ 2) 場合インター複合ヘテロレベル平均ケースの条件O N-2

  • スペースの複雑さは、要素を交換するときに一時変数が占めるメモリスペースです。最適なスペースの複雑さは、開始要素の順序がすでに配置されている場合、スペースの複雑さは0であり、最悪のスペースの複雑さは、開始要素の逆順の並べ替えです。 、スペースの複雑さはO(n)であり、平均スペースの複雑さはO(1)です。

おすすめ

転載: blog.csdn.net/qq_43801020/article/details/107937787