折半查找法

折半查找法的使用仅适用于有序数列,必须为递增或者递减关系

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int arr[]= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };     //输入一个有序数列
int sz =sizeof arr / sizeof (arr[0]);
int left = 0;                                                   //定义首次运算的最左侧数下标
int right = sz - 1;                                         //数组共有sz个数,最右侧数的下标为sz-1
int key = 0;
scanf("%d", &key);                                    //输入数字
while (left <= right)                                   //利用while循环把数组中间值与输入数字进行比对
{
int mid = left + (right - left) / 2;       //两个数的平均数计算为较大数减去较小数的一半加上较小数(这样计算可以防止相加数字过大数值溢出)


if (arr[mid] == key)                          //当左下标等于右下标时,这个下标指向的数即为要查找的数
{
printf("找到了,下标为%d\n", mid);
}
else if (key > arr[mid])                 //一次缩小一半范围,当被查找数在查找范围的右一半时,把上一次的中间右一位数定义为下一次查找范围的起始值
{
left = mid + 1;
}
else                                                //与上一句的意思相同,只是把查找范围缩小为左一半的内容。
{
right = mid - 1;      
}
}
if (left > right)                                        //上面的while循环如果无法找到输入值,则会left>right
{
printf("找不到");
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/higher_and/article/details/79730825