使用C中的递归二进制搜索查找目标索引
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C中的递归二进制搜索查找目标索引相关的知识,希望对你有一定的参考价值。
我只允许使用给定的参数。我无法想象找到目标的索引。有任何想法吗?
#include <stdio.h>
int RecBinarySearch(int arr[], int len, int target) {
if (len <= 0)
return 0;
int mid = len/2;
if (target == arr[mid]){
return 1;
}
if (target < arr[mid]){
int i=0;
return RecBinarySearch(arr, mid, target);
}
else {
return RecBinarySearch(arr+mid+1, len-mid-1, target);
}
}
int main(void){
int arr[6]={1,2,3,4,5,6};
int len=sizeof(arr)/sizeof(arr[0]);
int target = 5;
RecBinarySearch(arr,len,target);
}
答案
#include <stdio.h>
int RecBinarySearch(int arr[], int len, int target) {
if(len <= 0) return -1;
int mid = len / 2;
if(arr[mid] == target) return mid;
if(arr[mid] < target) {
int rightIndex = RecBinarySearch(arr+mid+1, len-mid-1, target);
return rightIndex == -1 ? -1 : mid+rightIndex+1;
} else {
int leftIndex = RecBinarySearch(arr, mid, target);
return leftIndex == -1 ? -1 : leftIndex;
}
}
int main(void){
int arr[6]={1,2,3,4,5,6};
int len=sizeof(arr)/sizeof(arr[0]);
int target = 5;
printf("%d", RecBinarySearch(arr,len,target));
}
另一答案
第一:你真的不需要这个目标的递归。您可以使用左右标记更有效地用循环替换它(由于各种原因,递归非常昂贵)。
第二:你不应该返回0或1,你应该返回mid或-1如果没有找到,并且因为你在递归调用中移动了数组(传递数组+ mid + 1),你应该添加将值移到返回值,然后在main中的返回值中获取位置。
另一答案
鉴于此,我只允许使用给定的参数,您可以使用以下。看到它工作here:
int BinarySearch(int arr[], int len, int target) {
int startI = 0, endI = len-1;
while(startI<=endI)
{
int mid= (startI+endI)/2;
if(arr[mid] == target)
return mid;
if(arr[mid] < target)
{
startI = mid +1;
}
else
{
endI = mid -1;
}
}
return -1;
}
以上是关于使用C中的递归二进制搜索查找目标索引的主要内容,如果未能解决你的问题,请参考以下文章