バブルソートのためのCプログラム:Cでのバブルソート

公開: 2020-10-20

目次

序章

配列のソートは、コンピューターサイエンスにおいて非常に重要な場所です。 その有用性は、特定の順序でデータを配置する必要がある場合に注目されます。 並べ替えアルゴリズムにはさまざまな種類があります。 最も一般的で広く使用されているソートアルゴリズムは、バブルソートです。

Cでのバブルソート

バブルソートでのソートに使用される手法は、シンプルで理解しやすいものです。 現在の要素を次の要素と比較し、条件によって指定されたとおりに大きいか小さいかを入れ替えるだけです。 アルゴリズムは非常に正確です。 その場所が見つかるまで要素が他の要素と比較されるたびに、それはパスと呼ばれます。

このアルゴリズムは、アレイのような泡の上部をフィルターで除去するため、水中の泡に匹敵します。 ソートに使用されるすべてのアルゴリズムの中で、バブルソートは、O(n ^ 2)の時間計算量で最も簡単で、最も遅くなります。 ただし、スワッピングが完了したときにループを終了するフラグ変数を使用することで、アルゴリズムを最適化できます。 バブルソートの最良のケースは、配列がソートされるときのO(n)です。

たとえば、以下に示すように、5つの数値のソートされていない配列を考えてみましょう。

13、32、26、34、9

バブルソートは最初の2つの要素の検討を開始し、それらを比較してどちらが大きいかを確認します。 この場合、32は13より大きくなります。したがって、この部分はすでにyソートされています。 次に、32と26を比較します。したがって、32は26より大きいことがわかります。したがって、それらを交換する必要があります。 新しいアレイは次のようになります

13、26、32、34、9

次に、32と34を比較します。それらはすでにソートされていることがわかります。 したがって、最後の2つの変数34と9に移動します。34は9より大きいため、これらを交換する必要があります。

値を交換し、最初の反復後に配列の最後に到達します。 これで、配列は次のようになります。

13、26。32、9、34

2回目の反復後、配列は次のようになります。

13、26、9、32、34

3回目の反復後、配列は次のようになります。

13,9,26,32,34

4回目の反復後、配列は完全にソートされます

9、13、26、32、34

必読: Cでのプロジェクトのアイデア

アルゴリズム

ここでは、配列にn個の要素があると想定しています。 さらに、値交換関数がすべての値を交換して、配列番号をソートされた順序にすることを前提としています。

バブルソート(配列)を開始

リストのすべての要素

array [i]> array [i+1]の場合

交換価値(配列[i]、配列[i + 1])

終了する場合

のために終了

配列を返す

バブルソートを終了

読む:データ構造での並べ替え:カテゴリとタイプ

擬似コード

上記のアルゴリズムでは、配列全体が昇順で並べ替えられるまで、配列要素の各ペア間で比較が行われることが明らかです。 配列がすでに昇順でソートされている場合のアルゴリズムの結果など、いくつかの複雑な問題が発生する可能性があります。 この問題を緩和するために、1つのフラグ変数を使用します。これにより、スワッピングがあったかどうかを確認できます。 これ以上スワッピングが必要ない場合は、内側のループから抜け出します。

バブルソートアルゴリズムの擬似コードは次のように書くことができます

プロシージャBubbleSort(配列:配列内のアイテム)

iterate = array.count;

k = 0の場合、反復-1を実行します。

フラグ=false

l = 0の場合、反復-1を実行します。

if(array [l]> array [l + 1])then

交換価値(配列[l]、配列[l + 1])

flag = true

終了する場合

のために終了

(交換されていない)場合

壊す

次の場合に終了

のために終了

プロシージャの戻り配列を終了します

Cでバブルソートのサンプルプログラムを試してみましょう

#include <stdio.h>

ボイドメイン

{{

int配列[10]、i、j、num

for(i = 0; i <= 9; i ++)

{{

scanf(“%d”、&array [i])

}

for(i = 0; i <= 9; i ++)

{{

for(j = 0; j <= 9-i; j ++)

{{

if(array [j]> array [j + 1])

{{

num = array [j];

array [j] = array [j + 1];

array [j + 1] = num;

}

}

}

printf("ソートされた配列は/n");

for(i = 0; i <= 9; i ++)

{{

printf(“%d”、&array [i])

}

}

サンプルに示されているように、このバブルソートアルゴリズムは、ユーザーから10個の数値を受け取り、それを配列に格納します。 次のパートでは、2つのforループがあります。 外側のループはI値に対して実行され、0から9未満になります。 外側のループの機能は、他の要素と比較する必要がある値のすべての要素を処理することです。

外側のループの内側に別のループがあります。 j = 0から始まり、8以下になるまで実行されます。 内部には、array[j]がarray[j+1]より大きいかどうかを比較およびチェックする条件付きifステートメントがあります。 条件が満たされると、array[j]とarray[j+1]の値が相互に交換されます。

この目的のために、numという名前の変数が使用されます。 最初にarray[j]がnumに割り当てられ、次にarray [j +1]がarray[j]に割り当てられ、最後にnumがarray [j+1]に割り当てられます。 このプロセスは、配列内のすべての要素が昇順で並べ替えられるまで続きます。 その後、ソートされた配列が出力されます。

バブルソートの最適化された実装

結果を改善するために、バブルソート用に最適化されたアルゴリズムがあります。 フラグ変数を使用すると、最適化が行われます。 フラグ変数は、スワッピングがある場合は1を保持し、そうでない場合はループから抜け出します。 以下は、 Cで最適化されたバブルソートプログラムです。

#include <stdio.h>

ボイドメイン

{{

int配列[10]、i、j、num、flag = 0;

for(i = 0; i <= 9; i ++)

{{

scanf(“%d”、&array [i])

}

for(i = 0; i <= 9; i ++)

{{

for(j = 0; j <= 9-i; j ++)

{{

if(array [j]> array [j + 1])

{{

num = array [j];

array [j] = array [j + 1];

array [j + 1] = num;

フラグ=1;

}

if(!フラグ)

{{

壊す;

}

}

}

printf("ソートされた配列は/n");

for(i = 0; i <= 9; i ++)

{{

printf(“%d”、&array [i])

}

}

指定されたプログラムは、通常のバブルソートプログラムと同様の方法で実行されます。 唯一の変更は、フラグ変数の使用です。 最初、フラグは0に設定されています。ただし、スワッピングが発生すると、フラグは1になります。これは、アレイにもう1つのチェックが必要であることを意味します。 一方、フラグが1でない場合は、スワッピングが行われていないことを意味し、配列が既にソートされていると想定して、内部ループを終了します。 実行すると、通常のバブルソートと同じ結果が得られます。

時間計算量

バブルソートの最良の時間計算量はO(n)です。 配列がすでにソートされている場合に発生します。 最悪のケースは、配列がソートされていない場合のO(n * n)です。

読む:今日チェックアウトすべきJavaのトップ12パターンプログラム

次は何?

Java、フルスタックソフトウェア開発について詳しく知りたい場合は、upGrad&IIIT-Bのフルスタックソフトウェア開発のPGディプロマをチェックしてください。これは、働く専門家向けに設計されており、500時間以上の厳格なトレーニング、9以上のプロジェクトを提供します。 、および割り当て、IIIT-B卒業生のステータス、実践的な実践的なキャップストーンプロジェクト、およびトップ企業との雇用支援。

あなたの夢の仕事に着陸

ソフトウェア開発におけるアップグレードおよびIIIT-BANGALOREのPGディプロマ
今すぐ登録