二分搜索

问题描述:二分搜索用以确定一个已经排序的数组X[N]中是否包含元素t,若包含,则返回下标p,其中X[p]  = t,否则返回-1.

                    假设该数组为递增数组,N ≥ 0,X[0] ≤ x[1] ≤ x[2] ≤ ... ≤ x[N-1].

补充:二分搜索的算法并不复杂,但是写一个完全正确的二分搜索并不简单。Knuth在其The Art of Computer Programming,Volume 3:Sorting and Searching的6.2.1节的历史部分指出,虽然第一篇二分搜索论文1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现。

编写程序:

伪代码(来自《编程珠玑》)

l = 0; u = n - 1

loop

        { mustbe(l, u) }

        if l > u

              p = -1; break

        m = (l + u) / 2

        case

                x[m]  < t: l = m+1

                x[m] ==t: p = m; break

                x[m]  > t: u = m-1

c代码:

int binarySearch(DataType t,DataType x[],int n)
{
	int l,u,m;
	l = 0;
	u = n - 1;
	while(l <= u)
	{
		m = (l + u)/2;
		if(x[m] < t)
			l = m + 1;
		else if(x[m] == t)
			return m;
		else
			u = m - 1;
	}
	return -1;
}

测试代码:

void main()
{
	DataType TestArray[] = {1,2,3,5,6,9,12,15,19,91};
	int t = 90;
	cout<<binarySearch(t,TestArray,sizeof(TestArray)/sizeof(TestArray[0]))<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值