C语言折半查找法(超详细)

折半查找法仅适用于对已有顺序的数组、数据进行操作!!!(从小到大)自我总结:折半查找法就是相当于(通过改变low或high的大小)把中间位置指到了key那个数那里,所以mid应该处于循环里面,即mid=high+low/2。注意:lowmidhigh都要与下标绑定,也就是说它们就是下标。且循环条件是:high>=low.

同时注意:若原来数组是由小到大排列的则:

      mid=(high+low)/2;

            if(key<a[mid])//说明要找的值在左边

            high=mid-1;

            else if(key>a[mid])//说明要找的值在mid右边

            low=mid+1;//最小值的位置往右进一位

若原来数组是由大到小排列的则:

mid=(high+low)/2;

            if(key>a[mid])//注意是由大到小排列 ,所以此时keyamid 左边,故high=mid-1

            high=mid-1;

            else if(key<a[mid])//注意是由大到小排列,所以此时keyamid】右边,故low=mid+1

            low=mid+1;

当然在下面这个代码中,也可以用选择排序法和冒泡法来对任意数组进行排序,然后在应用此函数,保证折半查找法的前提是排好序了。

#include<stdio.h>
 void zb(int key,int a[],int n)//key表示要找的数,a表示数组,n表示数组元素个数 
 {
 	int i,high,low,mid;
 	int count1=0,count=0;
 	low=0;
 	high=n-1;
 	while(high>=low)//保证右下标不小于左下标 
 	{	
		count++;
		mid=(high+low)/2;//总的来说变得是中间位置相当于把中间位置移到了key那个数那里,所以mid应该处于循环里面 
 		if(key<a[mid])//说明key在a【mid】的左半边 ,那么最右边的high下标就可以在下标mid基础上往左进一个单位了
		high=mid-1;
 		else if(key>a[mid])//说明key在a【mid】的右半边 ,那么最左边的low下标就可以在下标mid基础上往右进一个单位了 
 		low=mid+1;
		if(key==a[mid])
		{
			printf("元素找到了!!!\n一共查找了%d次\n它处于a[%d]位置上\na[%d]=%d\n",count,mid,mid,key);
			count1++;
			break;
		}
	}
	 if(count1==0)
	 printf("元素不存在!!!\n");
 }
 int main ()
 {
 	int key,n,a[100];
 	int i;
 	void zb(int key,int a[],int n);//声明定义函数 
 	printf("请输入数组元素个数:\n");
 	scanf("%d",&n);
 	printf("请输入(从小到大)所有数组元素:\n");
 	for(i=0;i<n;i++)
 	{
 		scanf("%d",&a[i]);
	 }
	 printf("请输入要查找的数:\n");
	 scanf("%d",&key);
	 zb(key,a,n);
	 printf("\n");
	 return 0;
 }

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值