/*
设 a[0:n-1]是已排好序的数组,请改写二分搜索算法,
使得当搜索元素 x 不在数组中时,
返回小于 x 的最大元素位置 i 和大于 x 的最小元素位置 j。
当搜索元素在数组中时,i 和 j 相同, 均为 x 在数组中的位置。
*/
#include<cstdio>
#include<algorithm>
using namespace std;
/*
定义查找函数,三个变量依次为 数组、数组长度、待查找元素
*/
int Search(int b[], int b_length, int b_num)
{
int b_detection = -1; //待查找元素的标志位
int b_right = b_length - 1; // 数组的右边界
int b_middle = 0; //中间值的标志位
int b_left = 0; //数组的左边界
/*二分查找*/
while(b_left <= b_right)
{
b_middle = (b_left + b_right) / 2;
if(b[b_middle] == b_num) //找到了待查找元素
{
b_detection = b_middle; //待查找元素的标志位等于b_middle的标志位
}
/*数组元素有序
待查找元素小于中间值 往中间值的左边查找
将中间值(包括中间值)右边的数据舍去
即 -- 将数组的右边界 b_right更新为b_middle - 1
*/
if(b[b_middle] > b_num)
{
b_right = b_middle - 1;
}
else
{
b_left = b_middle + 1;
}
}
int i = 0, j = 0; //定义距离待查找元素两侧最近的元素的标志位
/*
当待查找元素不在数组中
返回小于 x 的最大元素位置 i 和大于 x 的最小元素位置 j
*/
if(b_detection == -1)
{
i = b_right;
j = b_left;
printf("待查找元素不在素组中!\n");
printf("小于待查找元素的最大元素位置 i = %d\n",i);
printf("大于待查找元素的最小元素位置 j = %d\n",j);
}
/*
当待查找元素在数组中
i 和 j 相同, 均为 x 在数组中的位置
*/
else
{
i = b_detection;
j = b_detection;
printf("待查找元素在素组中\n");
printf("待查找元素在素组中的位置i = %d,j = %d\n",i,j);
}
}
int main()
{
int a[] = {1,2,3,4,5,16,17,18,19,20} ;//定义一个数组并初始化 (题目中已说明数组有序)
int length = sizeof(a) / sizeof(int);//计算出数组的长度 -- sizeof计算的是字节长度
int search_num; //定义需要查找的元素
printf("请输入待查找元素的值\n");
scanf("%d",&search_num);
Search(a,length,search_num); //调用函数并传参数
return 0;
}
二分搜素查找某个值
猜你喜欢
转载自blog.csdn.net/tian_he_he/article/details/85935740
今日推荐
周排行