C言語学習:配列要素のバブルソート

実際の開発では、配列要素を最大から最小(または最小から最大)の順に配置する必要があるシナリオが多数あります。これにより、データを検索するときに、より直感的になります。たとえば、次のようになります。

商品の単価を節約し、仕分け後の費用対効果を確認しやすい配列。

バブルソート、マージソート、選択ソート、挿入ソート、クイックソートなど、配列要素をソートする方法はたくさんあります。その中で、習得する必要がある最も古典的なものは「バブルソート」です。

小さなものから大きなものへのソートを例にとると、バブルソートの全体的な考え方は次のとおりです:

配列の先頭から始めて、隣接する2つの要素のサイズを継続的に比較し、配列の最後まで、大きい方の要素を徐々に後方に移動させます(2つの要素の値を交換します)。比較の最初のラウンドの後、最大の要素が見つかり、最後の位置に移動できます。

第1ラウンドの後、第2ラウンドに進みます。比較は依然として配列の先頭から行われ、配列の最後から2番目の要素に到達するまで、大きい方の要素が徐々に後方に移動します。2回目の比較の後、2番目に大きい要素を見つけて、最後から2番目の位置に配置できます。

類推により、n-1(nは配列の長さ)の「バブリング」ラウンドの後、すべての要素を配置できます。

全体の選別プロセスは、泡が常に水から出てくるようなもので、最大のものが最初に出て、2番目に大きいものが2番目に出て、最小のものが最後に出てくるので、この選別方法はバブルソート(バブルソート)と呼ばれます。

以下では、バブルソートを説明するための例として「3 2 41」を取り上げます。

ソートプロセスの最初のラウンド

3  2  4  1    (最初)

2 3 4 1(3と2を比較、交換)

2 3 4 1(交換せずに3と4を比較)

2 3 1 4(4と1を比較、交換)

最初のラウンドの終わりに、最大の数字4がすでに終わりになっているため、2番目のソートのラウンドでは最初の3つの数字を比較するだけで済みます。

ソートプロセスの第2ラウンド

2 3 1 4(最初のソートの結果)

2 3 1 4(2と3を比較し、交換しないでください)

2 1 3 4(3と1を比較、交換)

2回目のラウンドの終わりには、次に大きい数字3がすでに最後から2番目の位置にあるため、3回目のラウンドでは最初の2つの要素を比較するだけで済みます。

ソートプロセスの第3ラウンド

2 1 3 4(ソート結果の2回目)

1 2 3 4(2と1を比較、交換)

この時点で、並べ替えは終了です。

アルゴリズムの概要と実装

n個の要素を持つ配列R [n]でn-1ラウンドの比較を実行します。

最初のラウンドでは、(R [1]、R [2])、(R [2]、R [3])、(R [3]、R [4])、……。(R [N- 1]、R [N])、最大の要素がR [n]に移動されます。

第2ラウンドでは、(R [1]、R [2])、(R [2]、R [3])、(R [3]、R [4])、……。(R [N- 2]、R [N-1])、次に大きい要素がR [n-1]に移動されます。

。。。。。。。。

など、配列全体が小さいものから大きいものにソートされるまで続きます。

具体的なコードの実装は次のとおりです。

#include <stdio.h>

int main(){

  int nums [10] = {4、5、2、10、7、1、8、3、6、9};

  int i、j、temp;

  //バブルソートアルゴリズム:n-1ラウンドの比較を実行します

  for(i = 0; i <10-1; i ++){

    //各ラウンドの最初のn-1-iを比較します。つまり、最後のiは比較せずにソートされています。

    for(j = 0; j <10-1-i; j ++){

      if(nums [j]> nums [j + 1]){

        temp = nums [j];

        nums [j] = nums [j + 1];

        nums [j + 1] = temp;

      }

    }

  }

 

  //ソートされた配列を出力します

  for(i = 0; i <10; i ++){

    printf( "%d"、nums [i]);

  }

  printf( "\ n");

 

  0を返します。

}

演算結果:

1 2 3 4 5 6 7 8 9 10

最適化

上記のアルゴリズムは、ほとんどの教科書で提供されているアルゴリズムであり、そのうちの1つを最適化できます。i番目のラウンドを比較するときに、残りの要素がすでに並べ替えられている場合は、比較を続行する必要はなく、ループは終了します。ただし、これにより比較の数が減り、実行効率が向上します。

最適化されていないアルゴリズムは確実にn-1ラウンドの比較を実行し、最適化されたアルゴリズムは最大でn-1ラウンドの比較を実行します。

最適化されたアルゴリズムの実装は次のとおりです。

#include <stdio.h>

int main(){

  int nums [10] = {4、5、2、10、7、1、8、3、6、9};

  int i、j、temp、isSorted;

 

  //最適化アルゴリズム:最大n-1ラウンドの比較

  for(i = 0; i <10-1; i ++){

    isSorted = 1; //残りの要素がソートされていると仮定

    for(j = 0; j <10-1-i; j ++){

      if(nums [j]> nums [j + 1]){

        temp = nums [j];

        nums [j] = nums [j + 1];

        nums [j + 1] = temp;

        isSorted = 0; //配列要素を交換する必要がある場合、残りの要素が適切にソートされていないことを意味します

      }

    }

    if(isSorted)break; //交換が発生しない場合、残りの要素は並べ替えられています

  }

  for(i = 0; i <10; i ++){

    printf( "%d"、nums [i]);

  }

  printf( "\ n");

 

  0を返します。

}

追加の変数isSortedを設定し、それをフラグとして使用します。値「true」は残りの要素がソートされていることを示し、値「false」は残りの要素がまだソートされていないことを示します。

比較の各ラウンドの前に、残りの要素がソートされていることを前提とし、isSortedを「true」に設定します。比較中に要素を交換する必要がある場合、それは仮定が間違っており、残りの要素がソートされていないことを意味します。 、したがって、isSortedの値は「false」に変更されます。

ループの各ラウンドの後、isSortedの値をチェックすることにより、残りの要素がソートされているかどうかがわかります。

 

さらに、プログラミング能力を向上させたい場合は、C言語とC ++プログラミングを学んでください。カーブで追い越し、一歩速く!ここでお手伝いできるかもしれません〜

UPは、C / C ++プログラミングの学習に関するビデオチュートリアルをホームページにアップロードしています。興味のある方、または学習している方は、ぜひご覧ください。お役に立てれば幸いです〜

共有(ソースコード、実際のプロジェクトビデオ、プロジェクトノート、基本的な入門チュートリアル)

キャリアを変えてプログラミングを学び、自分で考えるよりも早く学び成長するために、より多くの情報を使用するパートナーを歓迎します!

プログラミング学習:

プログラミング学習:

おすすめ

転載: blog.csdn.net/weixin_45713725/article/details/114636865