バブルソートアルゴリズム、C言語バブルソートアルゴリズムの詳細

バブルソートは、最もシンプルでわかりやすいソート方法です。多くの計算ステップがあり、最速ではありませんが、最も基本的なものであり、初心者が習得する必要があります。

バブルソートの原理は、左から右に隣接する要素が比較されます。ラウンドを比較するたびに、シーケンス内の最大または最小のラウンドが見つかります。この番号は、シーケンスの右端からポップアップします。

小さいものから大きいものへの並べ替えを例にとると、最初の比較の後、すべての数値の中で最大の数値が右端に浮かび、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と記述しても問題ありませんが、プログラムは実行時に多くの無駄な作業を行います。

 

42件のオリジナル記事を公開 いいね10 10,000人以上の訪問者

おすすめ

転載: blog.csdn.net/qq_37659294/article/details/102760464