用递归的方式实现二分查找c语言

Python020

用递归的方式实现二分查找c语言,第1张

#include <stdio.h>

int a[100]= {1,2,3,5,11,12,14,15,29,55}//数组中的数(由小到大)

int k//要找的数字

int found(int x,int y)

{ int m=x+(y-x)/2

if(x>y)//查找完毕没有找到答案,返回-1

return -1

else

{ if(a[m]==k) return m//找到就返回位置.

else if(a[m]>k) return found(x,m-1)//找左边

else return found(m+1,y)//找右边

}

}

int main()

{ scanf("%d",&k)//输入要找的数字

printf("%d\n",found(0,9))//从数组a[0]到a[9]进行查找

return 0

}

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,已知一个有n个元素的有序序列, 将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x, 直到找到x或者是没有找到!

如果是常规的方法的话那么我们可以通过循环的方式, 按照上面说的算法, 找到则退出循环, 否则继续循环直到左下标位置小于或者等于右下标的位置.

按兄弟你的意思是要用递归方法进行搜索, 那么大概还是上面的算法, 只是把循环的方式改成递归方式: 如果没找到,则确定新的搜索范围, 即左右下标新位置, 然后把新的参数传给函数继续调用函数进行递归搜索!!

递归方式实现详细代码如下:

#include <stdio.h>

#define ARRAY_SIZE 10

#define NOT_FOUND -1

int BinarySearch(int array[], int left, int right, int NumToSearch)

{

int mid = (left + right) / 2

if (left <= right)

{

if (NumToSearch == array[mid])

{

return mid

}

else if (NumToSearch <array[mid])

{

right = mid - 1

return BinarySearch(array, left, right, NumToSearch)

}

else

{

left = mid + 1

return BinarySearch(array, left, right, NumToSearch)

}

}

return NOT_FOUND

}

int main()

{

int a[ARRAY_SIZE] = {2, 5, 6, 7, 13, 20, 22, 27, 112, 222}//假设一个已知的有序且是升序数列

int result = 0//查找的结果

int x = 13//假设我们要查找的数是13

int left = 0//序列开始下标

int right = ARRAY_SIZE - 1//序列结尾下标

result = BinarySearch(a, left, right, x)

if (result == NOT_FOUND)

{

printf("Not Found!\n")

}

else

{

printf("Found %d in array a, it is a[%d]\n", x, result)

}

return 0

}

希望对兄弟你有帮助!

你把

main()

{

"""""

c[i]=RecorBinarySearch(a[i],i,n,b,low,high,mid)

改成

c[i]=RecorBinarySearch(a,b,0,n-1)

}

然后涵数就改成这样

int RecorBinarySearch(int *a , int b , int n0, int n1)

{ int d=(n0+n1)/2

if (b==a[d]) return d

if (b>a[d])n0=d+1

else n1=d-1

if (n1==n0)

{if (b==a[n0]) return n0

else return -1

}

if (n1<n0)return -1

return (RecorBinarySearch(a, b, n0, n1))

}

这涵数程式我测试过, 应该没问题