简单常用的小代码系列——折半查找
//代码思想
//在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:
//1) 若查找数据值与中间元素值正好相等,输出中间元素的下标。
//2) 若查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,直到找到相等的值。
//3) 若查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,直到找到相等的值
//4) 如果最后找不到相等的值,则返回找不到信息。
#include
#include
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10 };
int key = 7;
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1; //数组长度
while (left <= right) //一定要带“=”
{
int mid = left + (right - left) / 2;//要放在循环里边
if (arr[mid] == key)
{
printf("找到了,下标是:%d\n", mid);
break;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
if (left>right)
printf("找不到\n");
system("pause");
return 0;
}
带函数的折半查找
//定义一个查找函数;
#include
#include
int binary_search(int arr[],int key,int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] ==key)
{
return mid;
}
else if (arr[mid] <key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int key =7;
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, key, sz);
if (-1 == ret)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是%d\n", ret);
}
system("pause");
return 0;
}