二分法查找

//二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n / 2]与x做比较,如果x = a[n / 2], 则找到x,
//算法中止;如果x<a[n / 2], 则只要在数组a的左半部分继续搜索x, 如果x>a[n / 2], 则只要在数组a的右半部搜索x
//时间复杂度为O()=O(logn)
//二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;
//其缺点是要求待查表为有序表,且插入删除困难。

//举例子 查找23
//下标0  1   2   3   4    5   6  
//数组11 17  23  34  46  49   62
//第一次 low =0 high =6, mid = 0+6/2=3,a[3]=34,改变high = mid-1 =2;
//第二次 low =0 hign =2, mid = 0+2/2=1,a[1]=17,改变low = mid+1=2;
//第三次 low =2 high =2, mid =2,a[2]刚好为23,返回下标2,则总共寻找了三次。

#include<iostream>
using namespace std;

//方法一 非递归

//二分法查找,x是要被查找的元素,n是数组中元素个数
//函数返回的是查找元素的下标 
int ccount = 0;//标记查找次数

int binarySearch(int list[], const int n ,const int x)
{
	int lower, high, mid;
	lower = 0, high = n - 1;

	while (lower <= high)
	{
		ccount++;
		mid = (lower + high) / 2;
		if (x == list[mid])
			return mid;

		else if (x < list[mid])//x在左半区间
			high = mid - 1;

		else //x在右半区间
			lower = mid + 1;
	}
	   
	return -1;//没找到
}

int main()
{
	int a[] = { 11, 17, 23, 34, 46, 49, 62 };

	int index = binarySearch(a, 7, 23);

	cout << ccount<<" "<< index <<" "<< a[index] << endl;

	system("pause");

	return 0;
}

//方法二 递归

//int BinSearch(int list[], int low, int high, int x)
//{
//	if (low <= high)
//	{
//		int mid = (low + high) / 2;
//
//		if (x == list[mid])
//			return mid;
//
//		else if (x < list[mid])
//			return BinSearch(Array, low, mid - 1, x);
//
//		else if (x > list[mid])
//			return BinSearch(Array, mid + 1, high, x);
//	}
//	else
//		return -1;
//}



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值