バイナリ検索
バイナリ検索はバイナリ検索とも呼ばれ、効率的な検索方法です。ただし、バイナリ検索では、線形テーブルが順次ストレージ構造を採用する必要があり、テーブル内の要素はキーワード順に配置されます。見つかった要素がテーブルにある場合はそれを返し、要素がテーブルにない場合はNULLを返します。
シーケンシャル検索とバイナリ検索の比較
バイナリ検索が効率的な検索方法であるのはなぜですか?
まずは、見てみましょう順次検索を。例えば、
私たちは持っている:
3、6、
9 、11、12、15、19、20、22、これらの9つの数字を。
数字の1つを自由に選択します。11だとすると、これらの9つの数字から11を見つける必要があります。見つかった番号が11の場合、それは見つかります。9つの番号の中に11がない場合、それは見つかりません。
最初のものから始めたとしましょう。1
回目:3、間違っています
。2回目:6、間違っています
。3回目:9、間違っています。4
回目:11、見つかりました。
これは順次検索です。1回の検索で除外できる番号は1つだけです。11を探しています。これは4回しかかかりませんが、25を探している場合は9回になります。さらに番号がある場合は、もっと時間がかかります。
では、より効率的なバイナリ検索は何ですか?
探している数がまだ11であると仮定すると、
最初はこれらの9つの数の中間の数を取ります:12。11<12、これは小さいので、12の右側の部分を除外できます。
2回目:12:9の左側の中央の数字を取ります。11> 9の方が大きいので、9の左側を除外できます。
3回目:9の右側の中央の数字を取ります:11。11= 11、それを見つけました。
この方法は、上記の順次検索よりもはるかに高速です。この例では違いが1つしかない場合がありますが、数値が多い場合はどうでしょうか。バイナリ検索ははるかに高速です。これがバイナリ検索です。
使用する
c言語でのバイナリ検索のアプリケーションを見てみましょう。ここではVS2013を使用しています。
#include <stdio.h>
int main()
{
char arr[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//tofind表示要找的数字
int tofind = 7;
//数组最左边元素的下标
int left = 0;
//数组最右边元素的下标
int right = sizeof(arr) / sizeof(arr[0]) - 1;
//sizeof(arr)是计算arr的字节
//sizeof(arr[0])是计算数组中第一个的字节
//两者相除就是数组长度
while (left <= right){
int mid = (left + right) / 2;
if (tofind > arr[mid]){
//说明你要查找的数在mid 的右边,
//因此需要向右递归查找
left = mid + 1;
}
else if (tofind < arr[mid]){
right = mid - 1;
}
else{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left>right){
printf("找不到");
}
system("pause");
return 0;
}