斐波那契查找

int F[] = {0,1,1,2,3,5,8,13,21,34};
int research2(int*a, int n, int key) {
	int low = 0,high = n - 1,mid;

	int k = 0;
	while (n-1 > F[k]-1)
		k++;

	for (int i = n; i < F[k]-1; i++)
		a[i] = a[n-1];//F[k-1]-1可能大于n,所以做一个补全数组的操作,保证mid=low+F[k-1]-1一定是在补全后的数组范围内
                                           
	while (low <= high) {          补全后的数组长度其实就是F[k]-1   ( F[k]-1=F[k-1]-1 + F[k-2]-1   + 1 )
		mid = low + F[k - 1] - 1;
		if (key < a[mid]) {
			high = mid - 1;
			k = k - 1;
		}
		else if (key>a[mid]) {
			low = mid + 1;
			k = k - 2;
		}
		else {
			if (mid <n)
				return mid;
			else
				return n-1;
		}

	}
	return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值