バブルソートは、最もシンプルでわかりやすいソート方法です。多くの計算ステップがあり、最速ではありませんが、最も基本的なものであり、初心者が習得する必要があります。
バブルソートの原理は、左から右に隣接する要素が比較されます。ラウンドを比較するたびに、シーケンス内の最大または最小のラウンドが見つかります。この番号は、シーケンスの右端からポップアップします。
小さいものから大きいものへの並べ替えを例にとると、最初の比較の後、すべての数値の中で最大の数値が右端に浮かび、2番目の比較の後で、すべての数値の2番目に大きい数値が最後から2番目の数値に浮かびます。ポジション...単にそれらをラウンドごとに比較し、最後に小さなものから大きなものへと並べ替えます。
たとえば、次のシーケンスを小さい順から大きい順に並べ替えます。90 21 132 -58 34
第1ラウンド:
1)90と21の比率、90> 21、次にポジションを交換:21 90132 -58 34
2)90対132、90 <132の比率。ポジションを交換する必要はありません。
3)132と-58の比率、132> -58、それらはポジションを交換します:21 90 -58 132 34
4)132と34の比率、132> 34、そしてそれらはポジションを交換します:21 90 -58 34 132
この時点で、最初のラウンドは比較的完了しています。最初のラウンドの結果は、シーケンス内で最大の数を見つけ、右端にフロートします。
比較する場合、各ラウンドのn番目の比較は、新しいシーケンスのn番目の要素とn + 1番目の要素の比較です(nが1で始まる場合)。
第2ラウンド:
1)21対90の比率、21 <90、ポジションを交換する必要はありません。
2)90と–58の比率、90> –58、それらはポジションを交換します:21 -58 90 34132
3)90対34の比率、90> 34、そしてそれらはポジションを交換します:21 -58 34 90 132
今回は2回目です。2番目のラウンドの結果は、シーケンスで2番目に大きい数を見つけ、右端の2番目の位置に浮動することでした。
第3ラウンド:
1)21と-58の比率、21> -58、次にポジションを交換:-58 21 34 90132
2)21対34の比率、21 <34、ポジションを交換する必要はありません。
これは第3ラウンドです。3番目のラウンドの結果は、シーケンス内で3番目に大きい数値を見つけ、右端の3番目の位置に浮動小数点数にすることです。
ラウンド4:
1)–58から21の比率、–58 <21、ポジションを交換する必要はありません。
この時点で、シーケンス全体がソートされます。小さい順から大きい順は、「– 58 21 34 90 132」です。この例から、n個のデータがある場合、比較する必要があるのはn–1ラウンドのみであると結論付けることもできます。最初のラウンドに加えて、各ラウンドはすべてを比較する必要はありません。前回のラウンドの比較後、比較されたラウンドはそのラウンドで最大の数を見つけ、右にフロートしたため、右側の数を比較して、それが大きいことを知る必要がないためです。
以下のプログラムを書いてください
# include <stdio.h>
int main(void)
{
int a[] = {900, 2, 3, -58, 34, 76, 32, 43, 56, -70, 35, -234, 532, 543, 2500};
int n; //存放数组a中元素的个数
int i; //比较的轮数
int j; //每轮比较的次数
int buf; //交换数据时用于存放中间数据
n = sizeof(a) / sizeof(a[0]); /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/
for (i=0; i<n-1; ++i) //比较n-1轮
{
for (j=0; j<n-1-i; ++j) //每轮比较n-1-i次,
{
if (a[j] < a[j+1])
{
buf = a[j];
a[j] = a[j+1];
a[j+1] = buf;
}
}
}
for (i=0; i<n; ++i)
{
printf("%d\x20", a[i]);
}
printf("\n");
return 0;
}
出力は次の
とおりです。2500900 543 532 76 56 43 35 34 32 3 2 -58 -70 -234
プログラム、ラウンドあたりの比較数がj <n–1ではなくj <n–1–iである理由
バブルソートの特性があるため、このプログラムは大から小にソートされます。したがって、1回目のソートの後、最小数は右端にフロートします。2回目のソートの後、2番目に小さい数は下にフロートします。 2つの位置。3回目の並べ替えの後、3番目に小さい数が最後から2番目の位置に浮動します...つまり、並べ替えの数と同じ数の丸めが行われ、並べ替えの要件に従って並べ替えられているため、並べ替えの必要はありません。比較。j <n–1と記述しても問題ありませんが、プログラムは実行時に多くの無駄な作業を行います。