目次
このブログでは、一般的に使用されるいくつかの方法、つまり二分探索とバブル ソートについて詳しく説明します。
1.二分探索
二分探索とは、毎回2つの部分に分けて、検索した数値と真ん中の数値を比較し、大きさを判断して検索した数値の部分を決定し、その数値のこの部分を比較し続けて2つの部分に分けることを意味しますなどを検索します。
二分探索を使用すると、必要な数値を 1 つずつ見つけるより効率的ですが、二分探索を使用する条件はソートされた配列でなければならないことに注意してください(このブログでは、シーケンシャル配列の二分探索方法について説明しています)。それ以外の場合は二分探索は使用できません。
二分探索のコード部分は次のとおりです。
int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int n = 8; int sz = sizeof(arr) / sizeof(arr[0]); int left = 0; int right = sz - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] < n) { left = mid + 1; } else if (arr[mid] > n) { right = mid - 1; } else { printf("找到所查找的数字,该数字下标是%d\n", mid); break; } } if (left > right) { printf("未找到该数字!\n"); } return 0; }
操作の結果は次のようになります。
二分探索に関する注意:
1、int n = 8;
ここで n は探している番号です
2、int sz = sizeof(arr) / sizeof(arr[0]);
sz は配列内の要素の数をカウントします
ここで、sizeof(arr) は配列全体のサイズを計算すること、sizeof(arr[0]) は配列の最初の要素のサイズを計算すること、配列全体のサイズを配列の最初の要素のサイズで割ることです。配列、つまり配列内に要素がいくつあるかを計算します。
3、int left = 0;int right = sz - 1;
後続の比較を容易にするために、配列の最初の要素の添字を左にし、配列の最後の要素の添字を右にします。
4、intmid = 左 + (右 - 左) / 2;
mid は比較する数値の添字です なぜ int mid = (left + right)/2 ではないのかというと、 left と right の値が大きいと left+right がオーバーフローを起こす可能性があるためです。したがって、 int mid = left + (right - left) / 2 を使用します。
5. if (左 > 右) printf("番号が見つかりません!\n");
whileループでは、left<=rightの場合、最後まで数字が見つからなかった場合、leftはrightよりmid+1となるので、left>rightが真と判断された場合は、検索された数字は見つからなかったということになります。が見つかり、「番号が見つかりませんでした」と出力されます。
2. バブルソート
バブルソートは実際には配列の最初の要素から開始して隣接する要素と比較し、順序が満たされない場合は置き換えてから次の要素と比較する、という具合です。
バブルソートは、より多くの要件を満たすために、配列内の要素を昇順にソートすることです。
バブルソートのコードは次のとおりです。
void bubble_sort(int* arr, int sz) { int i = 0; for (i = 0; i < sz - 1; i++) { int flag = 1; int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { flag = 0; int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (flag == 1) { break; } } } int main() { int arr[] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
操作の結果は次のようになります。
バブルソートに関する注意:
1、int sz = sizeof(arr) / sizeof(arr[0]);
main 関数のこのコード行は、配列内の要素の数を計算する二分探索と同じです。
2、bubble_sort(arr, sz);
バブル ソートの特定の操作用の bubble_sort 関数を作成し、配列の最初の要素のアドレス arrと配列要素の数 szを渡します。
3、void bubble_sort(int* arr, int sz)
int* arr は、main 関数で渡される arr、つまり整数ポインタ int*によって受け取られる配列の最初の要素のアドレスを受け入れます。
int sz は、main 関数で渡された配列要素の数を受け取ります。
4、for (i = 0; i < sz - 1; i++)
まず、最初の for ループについては、ループする必要があるループの合計数です。
なぜ sz-1 回ループするかというと、たとえば 3 つの要素の場合、最初のパスで最初の要素と他の 2 つの要素を比較し、2 番目のパスで 2 番目の要素と 3 番目の要素を比較し、3 番目のパスでelement 比較する必要がないため、3 つの要素は 2 回ループするだけで済み、以下同様に、sz 要素は sz-1 回ループする必要があります。
5、for (j = 0; j < sz - 1 - i; j++)
2 番目の for ループの場合、各ループに必要な回数です。
なぜ sz - 1 - i 回ループしているのかというと、もともと各要素は sz-1 回比較されるのですが、これにより比較が繰り返されることになります。最初の要素が後続のすべての要素と比較された後、後の要素は比較されません。最初の要素と再度比較されるため、sz-1 の通常の順序に加えて、サイクルあたりのサイクル数が、以前に比較された要素の数である i から減算され、これが比較の数になります。各サイクルに必要 sz- 1-i
6、
これらのコード行は理解しやすいです。順序が満たされない場合は、flag = 0 を設定し、一時変数 tmp を作成し、添字 j と添字 j+1 要素の交換を完了します。
7、if (フラグ == 1) ブレーク;
ここでのフラグ変数は効率を向上させるためのもので、主に配列内の要素が順番にソートされるのを防ぐためのものですが、依然として 2 つのループを実行するため、時間と労力がかかります。
最初の for ループでは Int flag = 1 が定義されています。2 番目の for ループの最初のループの後、フラグがまだ 1 であれば、配列要素全体が順番にソートされていることを意味するため、break は最初の A から飛び出ます。 for ループではループ全体が終了するため、効率が向上します
スワップが発生した場合は、配列内の要素が順番にソートされていないことを意味するため、フラグを 0 に変更し、以下の if ステートメントを無視して、通常のバブル ソートを実行します。
このブログはこれで終わりますので、興味のある方は他のブログもフォローしてみてください♪(^∇^*)