C语言:二分法搜索

二分法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])

(1)确定该区间的中间位置K

(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。(百度百科)

二分法搜索前提数据必须是有序数组,所以第一步对给定数堆进行排序:

void small_to_max(int a[],int length)   //此函数功能讲数据由小到大排序,之前文章有解释过
{
	int i;
	int max=0;
	while(length != 1){  
		
		for(i=0; i<length-1; i++){   
				if(a[i] > a[i+1]){
					max=a[i];
					a[i]=a[i+1];
					a[i+1]=max;
				}
		}

		length--; 
	}
}

由第一步已经得到一组有序数堆,然后就可以用二分法进行搜索:

int search(int a[],int length,int key)
{
	int result=-1;
	int left,right;    
	left=0;
	right=length;         //left数组最左值,right数组最右值
	
	while( right > left ){     
		int middle=(right+left)/2;
		
		if(key == a[middle] )
		{
		result = middle;
		break;	
		}
		else if ( key < a[middle] )
		{
			right = middle-1;
		}
		else 
		{
			left = middle+1;
		}
	}
	
	return result;
}

给定一组无序数堆,用户输入一个整数,使用二分法查找该数是否在此数堆中。

整体代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void small_to_max(int a[],int length);
int search(int a[],int length,int key);
int main()
{
	const int size=100;
	int a[size]={0};
	srand(time(NULL));        //rand函数生成随机数
	 
	 int i;
	 for(i=0; i<size; i++){
	 	a[i]=rand()%100;       //为了测试方便,随机给定100个100以内的数       
	 }
	 
	 int key=0;
	 printf("请输入你要查找的数:");
	 scanf("%d",&key);
	 

//调用small_to_max函数排序
	 small_to_max(a,sizeof(a)/sizeof(a[0]));   
	 printf("该数堆元素为:\n"); 
	 for(i=0; i<size; i++){
	 	printf("%d\t ",a[i]);
	 	if( i % 10 == 0){
	 		printf("\n");
		 }
	 }
	 printf("\n");
	 

//调用search函数查找输出结果
	 int result=search(a,sizeof(a)/sizeof(a[0]),key);
	 if(result != -1){
	 	 printf("%d该数在数堆第%d个位置上\n",key,result);
	 }else{
	 	printf("该数%d不在此数堆中\n",key);
	 }
	
	 return 0;
} 


void small_to_max(int a[],int length)   //将给定数据由小到大排序
{
	int i;
	int max=0;
	while(length != 1){  
		
		for(i=0; i<length-1; i++){   
				if(a[i] > a[i+1]){
					max=a[i];
					a[i]=a[i+1];
					a[i+1]=max;
				}
		}

		length--; 
	}
}

int search(int a[],int length,int key)  //二分法查找
{
	int result=-1;
	int left,right;
	left=0;
	right=length;
	
	while( right > left ){
		int middle=(right+left)/2;
		
		if(key == a[middle] )
		{
		result = middle;
		break;	
		}
		else if ( key < a[middle] )
		{
			right = middle-1;
		}
		else 
		{
			left = middle+1;
		}
	}
	
	return result;
}

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值