二分查找法(暴力拆解法)

概念

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 [百度知道]

分析

1,通过三个数来查找,开始值(低位置),中间值(mid),末尾值(高位置),下文分别称low位置,mid值,high位置

2,用你想查找的key值做比较,
如果key值大于mid值,就把mid值当成开始值(即把mid值赋值给low位置),继续求平均值,继续跟提供的值做比较
如果是小于中间值那么旧把末尾值变成中间值的位置,继续刚刚的操作,
(如果看不明白,代码里有详细的分部详解)

3,二分查找法相较于冒泡和递归来说效率高很多,但缺点也显而易见,如果数组中有重复的数字,程序就崩溃了。(因为只能返回一个下标)

实例

例如查找数组{5,13,19,21,37,56,64,75,80,88,92}中21的下标
在这里插入图片描述
1, 先确定low,mid,high的位置(注意这几个都是下标)
mid=(high+low)/2

2, 用mid位置的值与21比较,21<56

3, 令mid=high-1;(减1的原因是已经知道56不等于21,就可以直接跳到前一个位置,提高效率)

4,此时low指向5,high指向37,再算出mid=(high+low)/2,得到mid指向19,

5,用21和此时的mid值作比较,21>19,

6,所以令mid=low+1;(加1为提高效率)

7,在比较就得到mid = low = 21 了 ,就是下图这样
在这里插入图片描述

代码

#include<stdio.h>
void main()
{
	int ar[] = { 1, 23, 45, 65, 76, 87, 445, 77765, 34535, 234222, 999999 };
	int n = sizeof(ar) / sizeof(ar[0]);
	int key;
	printf("请输入要查找的key值:>");
	scanf("%d",&key);
	int low = 0;
	int high = n - 1;      //高位置例如999999他的下标是10,而n为11,则高位置应该等于最后一个数字的下标即n-1
	int mid, index = -1;   //index是一个索引,初始化为-1没有什么意义,后面用作结果输出
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (key == ar[mid])
		{
			index = mid;
			break;
		}
		else if (key < ar[mid])
		{
			high = mid - 1;
		}
		else
			low = mid + 1;
	}
	if (index == -1)
		printf("要查找的%d不存在。。。\n",key);
	else
		printf("要查找的%d的下标为%d",key,index);

	//
	//二分查找(有序的)                                             前提是数组有序!!!
	//  low位置,mid位置,high位置,key值, (前三个都是下标,key是真值,注意ar[low]和low的区别)
	//开始查找
	//      mid = (low + high)/2 ;
	//      if(ar[mid]==key)     -->查找成功,输出key值=mid值=……
	//      if(ar[mid]< key)     -->令mid=high+1,继续查找(再循环)       
	//      if(ar[mid]> key)     -->令mid=low-1, 继续查找(再循环)//-1没有其实也可以,但是有了会提高效率
	///
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值