二分查找的原理及代码实现

二分查找原理:

二分查找是在升序或者降序的情况下可以使用的查找方法。多次将查找数据和被查找数据段的中间数据比较,每次比较可以缩减一半的被查找数据段,极大的加快了查找速度。

代码思路:

1.先依次与数据段最左边arr(left)和最右边arr[right]的数据比较,若相等,则返回数组下标数字加一。不相等,则两者数组下标相加除二得到中间数组下标,即mid=(left+right)/2。

2.得到中间数组下标后,就可以得到中间值arr[mid],与中间值比较,若等于中间值,就返回中间值数组下标加一。若大于中间值,则左边数组下标变成中间值加一,即left=mid+1;右边数组下标自减一,即right=right-1;若小于中间值,则右边数组下标变成中间值减一,即right=mid-1;左边数组下标自加一,即left=left+1。

3.处理完步骤1与步骤2操作后,若未查找到数据,则用新得到的左边数组下标left与新得到的右边数组下标right再次进行步骤1与步骤2操作。发现也就是普通的嵌套操作

4.最后,思索如何确定数据段中没有这个数。由于是有序数据段,所以当数据大于最大值,小于最小值时,可以直接判定没有这个数。还有每一次进行步骤1与步骤2操作后,left与right都会进行相应的加减一,当left>right时,也可以直接判定没有这个数。

代码实现

所需头文件

#include "stdio.h"

冒泡排序(不清楚冒泡排序原理的欢迎在博主的空间里搜索了解一下)

void Bubble_Sort(int *arr,int sz)//冒泡排序
{
	int i=0;
	int j=0;
		for (i = 0; i < sz-1; i++)
		{
			for (j = 0; j < sz-1-i; j++)
			{
				if (arr[j] > arr[j + 1])
				{
					int n = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = n;
				}
			}
		}
}

二分查找实现(1)通俗版

int bin_search(int *arr, int left, int right, int aim) // arr 是查找的数组	left 数组的左
                                                //下标 right 数组的右下标 aim 要查找的数字                                                        
{	
	if(left>right||aim > arr[right]|| aim < arr[left])//left>right时,当数据大于最大值,小
		                                              //于最小值时,可以直接判定没有这个数。
    return -1;//返回-1表示没有这个数

	int mid = (left + right) / 2;
	if (aim == arr[left])
	{
		return left + 1;
	}
	else if (aim == arr[right])
	{
		return right + 1;
	}
	else
	{
		if (aim == arr[mid])
		{
			return mid + 1;
		}
		else if (aim > arr[mid])
		{
			bin_search(arr, mid + 1, right-1, aim);
		}
		else 
		{
			bin_search(arr, left+1, mid + 1, aim);
		}
	}
}	

 二分查找实现(2)精简版

int bin_search(int arr[], int left, int right, int key)
{
	int mid = 0;
	while(left<=right)
	{
        mid = left+(right-left)/2;

		if(arr[mid]>key)
		{
			right = mid-1;
		}
		else if(arr[mid] < key)
		{
			left = mid+1;
		}
		else
			return mid;//找到了,返回下标
	}
	return -1;//找不到
}

主函数

int main()
{
	int str[10] = { 6,1,2,3,4,7,6,7,8,9 };//数据段无序,这里使用冒泡排序将数据排成有序数据段
	int n = 0;
	scanf("%d",&n);
	int sz = sizeof(str)/ sizeof(int);
	Bubble_Sort(str,sz);
	int place = bin_search(str,0, sizeof(str)/sizeof(int) - 1, n);
	if (place == -1)
		printf("没有这个数");
	else
		printf("找到了,这个数在数据段的第%d个位置",place);
	return 0;
}

整体代码

#include "stdio.h"

int bin_search(int *arr, int left, int right, int aim) // arr 是查找的数组	left 数组的左        
                                             //下标	right 数组的右下标	aim 要查找的数字
{	
	if(left>right||aim > arr[right]|| aim < arr[left])//left>right时,当数据大于最大值,小                 
                                                      //于最小值时,可以直接判定没有这个数。
		return -1;//返回-1表示没有这个数

	int mid = (left + right) / 2;
	if (aim == arr[left])
	{
		return left + 1;
	}
	else if (aim == arr[right])
	{
		return right + 1;
	}
	else
	{
		if (aim == arr[mid])
		{
			return mid + 1;
		}
		else if (aim > arr[mid])
		{
			bin_search(arr, mid + 1, right-1, aim);
		}
		else 
		{
			bin_search(arr, left+1, mid + 1, aim);
		}
	}
}														

void Bubble_Sort(int *arr,int sz)//冒泡排序
{
	int i=0;
	int j=0;
		for (i = 0; i < sz-1; i++)
		{
			for (j = 0; j < sz-1-i; j++)
			{
				if (arr[j] > arr[j + 1])
				{
					int n = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = n;
				}
			}
		}
		for (i = 0; i < sz; i++)
		{
			printf("%d ", arr[i]);
		}
		printf("\n");
}
int main()
{
	int str[10] = { 6,1,2,3,4,7,6,7,8,9 };//数据段无序,这里使用冒泡排序将数据排成有序数据段
	int n = 0;
	scanf("%d",&n);
	int sz = sizeof(str)/ sizeof(int);
	Bubble_Sort(str,sz);
	int place = bin_search(str,0, sizeof(str)/sizeof(int) - 1, n);
	if (place == -1)
		printf("没有这个数");
	else
		printf("找到了,这个数在数据段的第%d个位置",place);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值