在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1(折半查找)

/在整型有序数组中查找想要的数字,找到了返回下标,找不到返回-1(折半查找)/
/*思路:
1.找到数组的中点元素,将数组从中点元素分为左半部和右半部;
2.比较所要找的数与中点元素的大小:
a)若前者大于后者在右半部中重复1和2,直到找到;
b)若前者小于后者在左半部中重复1和2,直到找到;
3.遍历完数组未找到该数,输出提示信息.
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//输入数组大小函数
int Input_size(){
	int n;
	printf("请输入数组的大小:\n");  //提示用户输入数据
	scanf("%d", &n);  //保存用户输入数组大小
	return n;  //返回数组大小
}

//输入数组元素函数
int* Input_elem(int n){
	int *p;  //定义一个指针p,用来指向新开辟的空间
	p = (int*)malloc(sizeof(int)*n);  //开辟n个int型的连续动态空间
	if (p == NULL){  //若空间开辟失败
		printf("空间开辟失败.\n");  //打印输出提示信息
	}
		printf("请输入数组元素(已排好序):\n");  //提示用户输入数据
	for (int i = 0; i < n; ++i){
		scanf("%d", &(*(p + i)));  //保存用户输入的数组
	}
	return p;  //返回指针p
}

//折半查找函数
int Binary(int *p,int n){
	int num;  //定义一个变量num,保存用户要查找的数据
	printf("请输入你要查的数:\n");  //提示用户输入数据
	scanf("%d", &num);  //保存用户要查的数num
	int left = 0;  //定义一个左值变量left
	int right = n - 1;  //定义一个右值变量right
	int mid = (left + right) / 2;  //定义一个中间值变量mid,赋值为left和right的中点值
	while (mid >= left && mid <= right){  //当mid在left和right之间
		if (*(p + mid) < num){  //若以mid为下标的元素值小于num
			left = mid + 1;  //left更新为mid + 1
			mid = (left + right) / 2;  //mid更新为新的left和原right的中点值
		}
			left = mid + 1;  //left更新为mid + 1
			mid = (left + right) / 2;  //mid更新为新的left和原right的中点值
		}
		else if (*(p + mid) > num){  //若以mid为下标的元素值大于num
			right = mid - 1;  //right更新为mid - 1
			mid = (left + right) / 2;  //mid更新为新的right和原left的中点值
		}
		else if (*(p + mid) == num){  //若以mid为下标的元素值等于num
			system("cls");  //调用清屏函数
			free(p);   //释放开辟的动态空间
			return mid;  //返回下标mid
		}
	}
	system("cls");   //调用清屏函数
	free(p);  //释放开辟的动态空间
		return -1;  //返回-1;
}

//主函数
int main(){
	int n = Input_size();  //调用输入数组大小函数,返回值赋值给n
	int *p = Input_elem(n);   //调用输入数组元素函数,返回值赋值给p
	printf("%d\n", Binary(p,n));  //打印输出调用折半查找结果
	system("pause");
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值