折半查找法

折半查找法:

  1. 首先的条件就是该数组是有序的
  2. 再次把数组对半拆
  3. 然后将查找的数与数组中间的数作比较
  4. 比较后有三种情况:
    (1) 等于中间的数
    (2)比中间的数要小
    (3)比中间的数要大

下面通过代码举例

#include <stdio.h>
#define N 5
int i;
int main(){
	void input(int []);//输入N个数
	void sort(int []);//给数组排序
	void output(int []);//输出N个数
	void search(int,int []);//从主函数中输入一个数去到数组中查找
	int num[N];
	input(num);//输入9 7 5 3 1
	sort(num);
	output(num);
	search(5,num);//查找5
	search(0,num);//查找0
	search(6,num);//查找6
	return 0;
}

void input(int num[]){
	for(i=0;i<N;i++)
		scanf("%d",&num[i]);
}

void sort(int num[]){
	int j,k,t;
	//选择排序法
	for(i=0;i<N-1;i++){
		k=i;
		for(j=i+1;j<N;j++)
			if(num[k]>num[j])//从小到大
				k=j;
		if(k!=i){
			t=num[i];
			num[i]=num[k];
			num[k]=t;
		}
	}	
}

void output(int num[]){
	for(i=0;i<N;i++)
		printf("%-2.0d",num[i]);
	printf("\n");
}

void search(int n,int num[]){
	int start=0,mind,end=N-1,sign=0,local;//start:头元素位置,mind:中间元素位置,end:最后一个元素位置,local:记录要找的数在数组中的下标,sign:是否在数组中找到
	if(n<num[start]||n>num[end])
		local=-1;//不在数组范围内
	while(!sign&&start<=end){
		mind=(start+end)/2;//得到中间的元素下标
		if(n==num[mind]){
			local=mind;
			printf("%d在数组中的第%d个位置\n",n,local+1);//local+1是因为数组下标从0开始的
			sign=1;//已找到
		}
		else if(n<num[mind])//位置在中间元素的左边
			end=mind-1;//缩小范围
		else//在中间元素的右边
			start=mind+1;
	}
	if(local==-1||!sign)//不在范围内或者数组中没有该数
		printf("找不到%d!\n",n);
}

测试结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值