二分查找数组中的数字

整体思路是:

1.创建一个数组,利用随机函数进行初始化数组。

2.将数组内的函数排序(快速排序)

3.键入一个需要查找的数,使用二分查找这个数,若存在里面则输出存在,打印下标。

注:并不是把所有满足的数都找到,而是找到一个以后就立刻打印下表(只找一个)


#define _CRT_SECURE_NO_WARNINGS 1
//利用随机函数初始化一个数组,然后排序,自己键入一个数,在数组中查找这个数,如果找到,返回这个数的下标(只返回一个)。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>//使用rand()函数,这里有一个疑问,为什么将此处的头文件换成windows.h也不会报错

//初始化数组
void init(int arr[],int len,int range)
{
	srand((unsigned)time(NULL));
	for (int i = 0; i < len; i++)
	{
		arr[i] = 1 + rand()%range;//产生1-10000之间的随机数,用来初始化数组arr
	}
}

//快速排序
void quickSort(int a[], int left, int right)
{
	if (left < right)//递归条件,不满足则退出
	{
		int l = left, r = right;
		int pivot = a[left];
		for (; l < r;)
		{
			for (; l < r && a[r] >= pivot; r--);
			if (l < r && a[r] < pivot)
			{
				a[l] = a[r];
				l++;
			}
			for (; l < r && a[l] <= pivot; l++);
			if (l<r && a[l]>pivot)
			{
				a[r] = a[l];
				r--;
			}
		}
		a[l] = pivot;
		quickSort(a, left, l - 1);
		quickSort(a, l + 1, right);
	}
}
//打印数组所有元素,传入数组名和数组长度
void print_arr(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		if (i % 10 == 0) printf("\n");//十个一行输出
		printf("%d\t", arr[i]);
		
	}
	printf("\n");
}
//寻找数组中是否有输入的数字
void match(int n,int arr[],int len)//找的数字,数组名,数组长
{
	int left = 0;
	int right = len - 1;
	

	while (left<=right)//left会逐渐增加,right会逐渐减小, 
	{
		int mid = (left + right) / 2;
		if (arr[mid] > n)//那么找的数字一定不在[mid,right]之间,可能会在[left,mid-1]之间
		{
			right = mid - 1;//保证只有可能在[left,right]中找到
		}
		else if (arr[mid] < n)//要找的数字一定不在[left,mid]之间,可能在[mid+1,right]之间
		{
			left = mid + 1;//保证只有可能在[left,right]中找到
		}
		else//说明arr[mid]==n了
		{
			printf("在下标%d的地方找到这个数\n", mid);
			break;//找到后就该跳出,读者可以尝试下去掉break,看下运行结果
		}
	}
	if (left > right)//说明[left,right]这个区间已经不存在了,也就是找不到这个数
	{
		printf("数组中没有这个数\n");
	}
}
int main()
{
	int arr[100];
	int len = sizeof(arr) / sizeof(arr[0]);
	int range = 100;//数组在1-range里面选数字
	init(arr, len,range);//随机数初始化一下数组
	quickSort(arr, 0, len - 1);//给数组排个序
	print_arr(arr,len);//把数组打印一下
	
	printf("请输入要查找的数:");
	int n = 0;
	scanf("%d", &n);
	match(n,arr,len);


	

	return 0;

}

对于我本人来说需要重点捋清楚的就是match()函数内while的循环条件为什么是(left<right);

若输入的数字没在数组里面,随着循环不断进行,left逐渐增加,right逐渐减少,会达到left=right;

进入下一次循环后会发生left++或者right--,无论发生哪一种,都会产生left>right;也就是[left,right]这个区间不存在了,所以不可能找到匹配.循环结束。

在循环外面加入left和right的比较就能知道,循环是break退出的还是,由于不满足循环条件退出的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值