実際の開発では、配列要素を最大から最小(または最小から最大)の順に配置する必要があるシナリオが多数あります。これにより、データを検索するときに、より直感的になります。たとえば、次のようになります。
商品の単価を節約し、仕分け後の費用対効果を確認しやすい配列。
バブルソート、マージソート、選択ソート、挿入ソート、クイックソートなど、配列要素をソートする方法はたくさんあります。その中で、習得する必要がある最も古典的なものは「バブルソート」です。
小さなものから大きなものへのソートを例にとると、バブルソートの全体的な考え方は次のとおりです:
配列の先頭から始めて、隣接する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 ++プログラミングの学習に関するビデオチュートリアルをホームページにアップロードしています。興味のある方、または学習している方は、ぜひご覧ください。お役に立てれば幸いです〜
共有(ソースコード、実際のプロジェクトビデオ、プロジェクトノート、基本的な入門チュートリアル)
キャリアを変えてプログラミングを学び、自分で考えるよりも早く学び成長するために、より多くの情報を使用するパートナーを歓迎します!
プログラミング学習:
プログラミング学習: