二分查找程序实现
使用二分法的前提是有序数组
有点麻烦并且low的写法
用while循环实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0])-1;
int key = 0;
scanf("%d", &key);
int mid = 0;
while (left <= right)
{
mid = left + (right - left) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
break;
}
}
//跳出循环 找到了从break跳出的 mid=key 或者是l不满足循环条件eft>right(即为找不到key)跳出了循环
if (left <= right)
{
printf("找到了关键字位于为arr[%d]",mid);
}
else
{
printf("没有找到");
}
system("pause");
return 0;
}
进阶版:建立Binary search 函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int BinarySearch(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)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
return mid;//找到了直接返回mid
}
}
return -1;//没找到返回-1
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int key = 0;
scanf("%d", &key);
int ret = 0;
int sz = sizeof(arr)/ sizeof(arr[0]);
ret = BinarySearch(arr, key, sz);
if (-1==ret)
{
printf("没有找到");
}
else
{
printf("找到了关键字位于为arr[%d]", ret);
}
system("pause");
return 0;
}
建立二分法的函数,在函数里面实现循环
1.循环判断的条件:
为什么不写死循环??
如果找不到的条件下,right会移动到left 的前面,此时,程序会一直等待不会退出了。
while (left <= right)
2.不能用return 0 万一数组下标0 就是要找的怎么办?
3==.在语句里面要注意 else 后面直接跟语句,要加条件必须else if.
4. 传参的时候,数组下标是被忽略的! int arr[]
写在最后
本来这个应该十分钟就搞定,结果我出现了几个错误,在以下做个简单分析
1.又一次把等号和赋值符号给弄错
果然下一次我一定要把数字写到前面,气死我了,调试了三四次。
2. 循环里面if 多的时候要注意检查{ }
今天因为{} 的原因程序出错了
3. {}太多的时候一定要认真看语句的正确位置 这个错误害我又检查了很长时间
每天进步一点点加油嗷!!!