C语言实现 用折半查找法寻找数组中的数


一、注意

提示: 读者可根据需求修该#difine N 15的值以达到重新定义数组的长度
如果读者使用的是Visual Studio的话第一行要加上如下代码否则使用scanf函数时会报错。

二、答案

运行结果在这里插入图片描述
在这里插入图片描述

1.源代码

#define _CRT_SECURE_NO_WARNINGS 1
#define N 15
#include<stdio.h>
int main()
{	
	int a[N], e, f, g, b, c, d, h, i, j = 0, k, n;
	   b = 0; c = N - 1; d = 2;	
	printf("请输入数组a[%d]里面的%d个数:",N,N);
	for (e = 0; e <= N-1;e++) {	
			scanf("%d,", &a[e]);	
	}
	for (e = 0; e <= N - 2;e++) {
		for (f = e + 1; f <= N - 1; f++) {
			if (a[e] < a[f]) {
				g = a[e]; a[e] = a[f]; a[f] = g;	}
		}
	}
	for (e = 0; e <= N - 1; e++) {
		if (e == 0) { printf("该数组从大到小排列后a[%d]={",N); }
		if (e<=N-2) { printf("%d,", a[e]); }
		else 
			printf("%d}\n", a[e]);		
	} 
	printf("输入您要寻找的数:");
	scanf("%d", &n);
	do {
		h = (b + c) / 2;
		if (a[h] == n) {
			d = 1;
			for (i = 0; i < N; i++) {
				if (a[i] == n) {
					
					if (j < 1) {
						printf("找到%d,对应的数组为:", n);
					}
					else
						;
					 printf("a[%d] ", i); 
					 j++;
				}				
			}
			break;
		}
		else if (a[h] < n) {
			c = h - 1;
		}
		else
			b = h + 1;	
	} while (c>=b);
	if (d == 2) {
		printf("不能找到%d",n);
	}
	return 0;
}

2.代码讲解

1.预定义difine N 15的作用

#define N 15

为了定义数组的长度,该代码表示该数组有15个元素,读者可以根据自身需求进行更改。

2.第一个for循环的作用

将数依次储存在a[N]中。

3.第二个for循环(包括其内部循环)的作用

将数组a[N]中的数进行降序排列。
如果需要进行升序排列的话,只需要将第二个for循环改为如下即可。

for (e = 0; e <= N - 2;e++) {
		for (f = e + 1; f <= N - 1; f++) {
			if (a[e] > a[f]) {
				g = a[e]; a[e] = a[f]; a[f] = g;	}
		}
	}

4.第三个for循环的作用

将排序后的数组进行输出

5.scanf(“%d”, &n)的作用

输入你准备查找的数字

5.do…while&&最后一个if的作用

查找并判断你输入的值是否存在,do…while…里面的第一个if判断存在的情况,循环体外的if用以判断不存在的情况。

	do {
		h = (b + c) / 2;
		if (a[h] == n) {
			d = 1;
			for (i = 0; i < N; i++) {
				if (a[i] == n) {
					
					if (j < 1) {
						printf("找到%d,对应的数组为:", n);
					}
					else
						;
					 printf("a[%d] ", i); 
					 j++;
				}				
			}
			break;
		}
		else if (a[h] < n) {
			c = h - 1;
		}
		else
			b = h + 1;	
	} while (c>=b);
	if (d == 2) {
		printf("不能找到%d",n);
	}

总结

该代码在寻找你输入的数时用到了折中的思想,这么做提高了代码运行的效率,读者只要能够理解do…while…的意思基本上这个程序的精髓就得以掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tan90degrees

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值