Ⅰ C语言递归函数如何实现二分搜索算法
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用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;
}
希望对兄弟你有帮助!
Ⅱ 用C语言编写非递归算法实现折半查找(二分查找)
char
a[10][5];//按字典序递增
int
search(char
*x)//二分查找,返回有序表中大于等于x的元素位置
{
int
low=0,high=9,mid,t;
while(low<=high)
{
mid=(low+high)/2;
t=strcmp(a[mid],x);//比较中点位置与x
if(t==0)
return
mid;//相等返回其位置
else
if(t>0)
high=mid-1;//x小于mid元素,则在中点前
else
low=mid+1;
}
return
high+1;//返回大于x的第一个元素
}
这个是我曾经用过的字符串的二分查找~
请根据需要修改数据类型。。。
Ⅲ 顺序表的排序,二分法查找的c语言程序
#include<stdio.h>
int fun(int a[],int n,int key)
{i
nt low,mid,high;//low、mid、high是三个索引分别指向数组的下标low=0;//low指向数组a[]的第一个元素,即下表为0的元素
high=n-1;//lhigh指向数组a[]的最一个元素,即下表为n-1的元素,n为数组的长度
while(low<=high)//循环终止条件是low>high的时候
{
mid=(low+high)/2;//所谓二分查找就在这里,每次都让mid指向数组下标等于low和high之和的一半的元素i
f(key<a[mid])//如果a【mid】大于要查找的元素,说明要查找的元素在low和mid之间,这是需要把high重新置为mid-1
(high=mid-1);//这里应该是{},不能使()吧
else if(key>a[mid])//这里同理,如果a【mid】小于要查找的元素,说明要查找的元素在mid和high之间,这是需要把low重新置为mid+1
(low=mid+1);
else
return mid;//剩下的就是相等的情况,直接返回mid就是查找到的结果
}
return -1;//执行到这一步就说明,low>high,没有找到要查找的元素,返回-1表示没有结果
}
main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int a,b,c;
b=4;
c=fun(a,10,b);
if(c==1)
printf("not found");
else
printf("psition %d\n",c);
}