二分查找的变形问题思想
1:第一种想法:我们首先找到待查找值在数组中的位置,然后根据条件向前 或后索引看是否也等于该值。
num[i]==value我们再根据条件判断num[i-1]==value or num[i+1]=value这也来查找。
2:第二种想法:主要就是我们要如何让low and high收敛到目标位置上。这个就根据我提供我程序来看吧,写的比较啰嗦,小白笔记。
在一个有序的数组中查找第一次出现某个值的位置。
void find1(int *num)
{
int low=0;
int high=MAXSIZE-1;
int value,mid=0;
printf("请输入你要查找的元素:");
scanf("%d",&value);
while(low <= high)
{
mid=low+((high-low)>>1);//这里相当于除以2
if(num[mid]>=value)
{
high=mid-1; //如果等号取到了,因为我们不知道这个是不是第一次出现的,所以我们需要看它的前面一个元素
}
else
{
low=mid+1;//这里可以让其收敛到第一个出现value的位置上
}
}
if(num[low]==value && low<10 && high >=0)
printf("%d第一次出现在数组下标为%d的位置\n",value,low);
else
printf("%d不在数组中\n",value);
}
在一个有序数组中查找某个值最后一次出现在数组中的下标。
void find2(int *num)
{
int low=0;
int high=MAXSIZE-1;
int value,mid=0;
printf("请输入你要查找的元素:");
scanf("%d",&value);
while(low <= high)
{
mid=low+((high-low)>>1);//这里相当于除以2
if(num[mid]<=value)
{
low=mid+1; //如果等号取到了,因为我们不知道这个是不是第一次出现的,所以我们需要看它的后面一个元素
}
else
{
high=mid-1;//这里可以让其收敛到最后一次出现value的位置上
}
}
if(num[high]==value && high>=0 && low<10)
printf("%d第一次出现在数组下标为%d的位置\n",value,high);
else
printf("%d不在数组中\n",value);
}
在一个有序数组中,查找第一个大于给定元素的值
void find3(int *num)
{
int low=0;
int high=MAXSIZE-1;
int value,mid=0;
printf("请输入你要查找的元素:");
scanf("%d",&value);
while(low <= high)
{
mid=low+((high-low)>>1);//这里相当于除以2
if(num[mid]>value)
{
high=mid-1;
}
else
{
low=mid+1;//这里可以让其收敛到目标位置
}
}
if(num[low]>value && low<10 && high>=0)//因为是第一次出现大于value的位置。这里还需要加上边界条件的判断
printf("第一次出现大于%d,在数组下标为%d的位置\n",value,low);
else
printf("不存在大于%d的数组元素\n",value);
}
在一个有序数组中,查找最后一个小于给定元素的值。
void find4(int *num)
{
int low=0;
int high=MAXSIZE-1;
int value,mid=0;
printf("请输入你要查找的元素:");
scanf("%d",&value);
while(low <= high)
{
mid=low+((high-low)>>1);//这里相当于除以2
if(num[mid]<value)
{
low=mid+1;
}
else
{
high=mid-1;//这里可以让其收敛到目标位置
}
}
if(num[high]<value && low <10 && high>=0) //因为是最后一一次小于value的情况
printf("最后一次出现小于%d,在数组下标为%d的位置\n",value,low);
else
printf("不存在小于%d的数组元素\n",value);
}
num是我们传入的一个数组,在里面进行查找。
注意:二分查找适合数据量较大的查找,对于数据量不大的话,其实顺序查找跟二分查找差不多,而且顺序查找还对数据要求没有这么的严格,即使不是有序的也不会影响。但是二分查找就不可以。
最后在上面提供的程序中没有写主函数,可以自己给定