-
再讲之前我先举一个列子,我们在和朋友玩的时候,看到他买了一双鞋,你问他多少钱呀? 他说1000以内,那么你会怎么猜呢?是从一到1000挨个猜呢?还是通过猜中间数字来尽快接近答案呢?*
-
今天我们的折半查找就是来解决这样的查找问题的*
-
折半查找就是在数据为有序的时候,我们将通过折半来直接否定错误答案,以最快的速度找到我们想要的数据。
通过left 和right分别指向数据的最左边的地址和最右边的地址,在通过mid=(right+left)/2来确定是否地址为mid的数据为我们想要找到的数据。*
如果地址为mid大于我们要找的数据key,我们将left不变,right=mid-1;这样就可以将我们的查找范围直接缩小一半。
如果地址为mid小于我们要找的数据key,我们将right不变,left=mid+1。
如果地址为mid的数据为我们要找的key,则返回mid,结束查找。*
代码实现如下:
#define _CRT_SECURE_NO_WARINGS
#include<stdio.h>
#include<string.h>
int main()
{
int num[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//有序数据
int left = 0, right = 0, mid = 0;
int key = 0;
printf("输入你要查找的数\n");
scanf_s("%d", &key);//要找的关键字
right = sizeof(num) / sizeof(num[0]) - 1;//此处注意
while (left <= right)//折半主要代码
{
mid = (left + right) / 2;
if (num[mid] == key)
{
printf("找到了下标为:%d\n", mid); break;
}
else if (num[mid] < key)
left = mid + 1;
else if (num[mid]>key)
right = mid - 1;
else
printf("查找失败");
}//一定注意是num[mid]与key作比较
return 0;
}
分享一下一个猜数字小游戏(内容仅为娱乐):
#define _CRT_SECURE_NO_WARINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int key = 0;
int i = 0;
int n = 0;
int a = 0;
flag1:
printf("*************************************************\n");
printf("*********选择1为开始游戏选择0为结束游戏**********\n");
printf("*************************************************\n");
printf(" 快点输入:>");
scanf_s("%d", &i);
if (i == 1)
{
printf("游戏开始喽嘤嘤嘤<@.@>\n"); goto flag2;
}
else if (i == 0)
{
printf("不玩滚蛋<-.->\n"); goto flag3;
}
else
{
printf("看清楚标题好吗<?.?>\n"); goto flag1;
}
flag2:
srand((unsigned)time(NULL));//加入时间戳,使随机数更加随机
n= rand() % 100 + 1;//将随机产生的数字控制在1~100之间
do
{
printf("请输入猜的数字嘻嘻嘻:>");
scanf_s("%d", &key);
if (n < key)
printf("猜大了\n");
else if (n>key)
printf("猜小了\n");
else
{
printf("恭喜恭喜你太棒了,你简直是天才,放心你的前途是光明的,将来一定是你的,相信自己\n"); break;
}
} while (1);
printf("\n这么好玩,你还要玩吗?<@.@>要玩的话输入520\n 请输入:>");
scanf_s("%d", &a);
if (a == 520)
goto flag1;
else
printf("滚滚滚\n");
flag3:
return 0;
}