バブルソートの原則とC ++ソースコードの実装


1.原則

隣接する2つの数値を比較し、大きい方の値を右に入れ替えます。


2.考える

隣接する2つの数字を順番に比較し、小さい数字を左側に、大きい数字を右側に配置します。具体的な手順は次のとおりです。

  1. 最初の比較では、最初の数値が2番目の数値と比較され、小さい数値が左側に配置され、大きい数値が右側に配置されます。
  2. 2番目の比較は、2番目の数値を3番目の数値と比較することです。左側が小さい数値、右側が大きい数値です。
  3. 3番目の比較では、3番目の数字と4番目の数字を比較します。小さい数字は左側に配置され、大きい数字は右側に配置されます。
  4. 比較は、最後の2つのデータ比較が完了するまで続けられ、その後、ソートのラウンドが完了します。最後の番号は、配列内の最大の番号です。次のラウンドの比較を実行するとき、最後の値は比較に参加する必要はありません。
  5. 比較の次のラウンドは、上記のルールに従って引き続きソートされます。ソートの各ラウンドが完了すると、ソートの次のラウンドに参加する値の数は1つ少なくなります。

例:
データをバブルソートします[1、4、2、6、7、3、5、10、9]。

  1. ソートの最初のラウンド
    1)最初のソート:1と4が比較され、1は4より小さい、交換する必要はありません。配列を取得します[1、4、2、6、7、3、5、10、9]
    2)2番目の並べ替え:4と2の比較、4は2より大きい、位置を交換し、配列を取得します[1、2、4、6、7、3、5、10、9]
    3)3番目の並べ替え:4 6、4から5小さい、交換する必要はありません、配列を取得します[1、2、4、6、7、3、5、10、9]
    4)4番目のソート:6と7、6は7よりも小さい、交換する必要はありません、配列を取得します[1、2、4、6、7、3、5、10、9]
    5)5番目の順序:7と3が比較され、7は3より大きい、位置を交換し、取得します配列[1、2、4、6、3、7、5、10、9]
    6)6次:7と5が比較され、7が5より大きい、位置を交換し、配列[1、2、 4、6、3、5、7、10、9]
    7)7番目の並べ替え:7と10が比較され、7は10より小さいため、交換する必要はなく、データを取得します[1、2、4、6、3 、5、7、10、9]
    8)8番目のソート:10と9の比較、10は9より大きい、位置を交換、データを取得[1、2、4、6、3、5、7、9、10]この
    ラウンドには8ラウンドのソートがあり、ソート結果は[ 1、2、4、6、3、5、7、9、10 ]です。

  2. 2回目のソート
    2回目のソートデータは、前のラウンドのソート結果に基づいています。前のラウンドの右端の値が最大値であるため、このラウンドのソートでは、の最大値と比較してソートする必要はありません。前のラウンド。
    1)最初の並べ替え:1と2が比較され、1は2より小さい、交換する必要はありません。配列を取得します[
    1、2、4、6、3、5、7、9、10 ] 2)2番目の並べ替え:2と4の比較、2は4より小さい、交換する必要はありません、配列を取得します[
    1、2、4、6、3、5、7、9、10 ] 3)3番目のソート:4と6、4が6より小さい場合、Exchangeは不要、配列を取得します[
    1、2、4、6、3、5、7、9、10 ] 4)4番目の並べ替え:6と3を比較し、6は3より大きい、位置を入れ替える、配列を取得[1、2、4、3、6、5、7、9、10]
    5)5次:6と5の比較、6は5より大きい、位置を交換、配列を取得[1、2、
    4、3、5、6、7、9、10 ] 6)6番目の並べ替え:6と7、6は7より小さいので、交換する必要はありません。配列[1、2、4、3、5、6 、
    7、9、10 ] 7)7番目のサブソート:7および9、7は9より小さい、位置は不要、配列[1、2、4、3、5、6、7、9、10 ]は
    このラウンドでソートされ、ソートの結果:[ 1、2、4、3、5、6、7、9、10 ]

  3. 次の並べ替えラウンドに進みます...


3つ、バブルソートの特徴

  • N回の並べ替え、合計N-1回の並べ替え、各i回の並べ替え時間は(Ni)回であるため、ソースコードを実装すると、二重ループを使用できます。外側のループは、ループし、内側のループは各ラウンドの数を制御します。比較の数。

  • 利点:並べ替えのラウンドが実行されるたびに、比較が1つ少なくなります。これは、並べ替えのラウンドで大きな値が検出されないためです。アルゴリズムの量をある程度減らします。

  • 時間計算量
    1)データが正の順序である場合、ソートを完了するのに1ラウンドしかかかりません。比較の数Cと記録の移動の数Mは両方とも最小に達します。つまり、Cmin = n-1、Mmin = 0であるため、最小の時間計算量はO(n)です。
    2)データが逆の順序である場合、n-1ラウンドのソートが必要です。並べ替えの各ラウンドにはniの比較が必要であり、各比較では、交換レコードの位置に到達するためにレコードを3回移動する必要があります。最大時間計算量は次のとおりです。

ここに画像の説明を挿入
したがって、バブルソートの合計平均時間計算量はO(n2)であり、時間計算量はデータステータスとは関係ありません。


4、C ++ソースコードの実装

簡単な要約:2つのループが実行されます。

/*
1.从当前元素起,向后依次比较每一对相邻元素,若逆序则交换
2.对所有元素均重复以上步骤,直至最后一个元素
*/
void buddleSort(int arr[], int len)
{
    
    
	int temp = 0;
 	int i, j;

	for(i = 0; i < len-1; i++) //外循环为轮数
	{
    
    
		for(j=0; j < len-1-i; j++) //内循环为每轮比较次数,第i轮比较len-i次
		{
    
    
			//相邻元素,若逆序则交换(升序为左大于右,降序反之)
			if(arr[j] > arr[j+1]) 
			{
    
    
				temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}	
	}
}

おすすめ

転載: blog.csdn.net/locahuang/article/details/110166279