简单的有序表查找算法

  查找算法,分顺序查找和有序表查找,前者是一种最基本的,也是最费力的方式,就是挨个去匹配要查找的元素,而后者则是先排序,然后去查找!在处理较大数据的时候,有序表的查找算法是很有优势的!
#include 

int Binary_Search(int *a, int n, int key)
{
	int low, mid, high;                        //定义高中低3个变量
	low = 0;
	high = n;
	while(low <= high)
	{
		mid = (low + high) / 2;             //取中间的那个,就是二分
		if (key < a[mid])                    //如果小于中间值,high=mid-1
			high = mid -1;                 
		else if (key > a[mid])               //相反就加一
			low = mid + 1;
		else
			return mid;
	}
	return 0;
}

int main()
{
	int a[10] = {1, 4, 8, 11, 24, 345, 567, 789, 999, 1234};
	int reValue = Binary_Search(a, 10, 24);
	printf("%d", reValue);
	return 0;
}
  同样是有序排序法,下面介绍的是插值排序法,其原理和二分法是一样的,只是不是二分而已,就上面mid = low + (key - a[low])/(a[high] - a[low])*(high - low)换成这个,其他的一样,二斐波那契查找,是先构建斐波那契数列,
#include 
int Fibonacci_Search(int *a, int n, int key)
{
	int F[10] = {0,1,1,2,3,5,8,13,21,34};               //构造一个斐波那契如
	int low, high, mid, i, k;                           //果复杂可以使用函数
	low = 0;
	high = n;
	k = 0;
	while (n > F[k] -1)		/*计算n位于fibonacci数列的位置*/
		++k;                     //匹配n对应的F(K)
	for (i = n; i < F[k]; ++i)		/*将数列补满*/
		a[i] = a[n];                      //现在这个数列有f[k]个数值

	while(low <= high)
	{
		mid = low + F[k - 1] - 1;    //此时,这个数列有F(k)个数,数列的个数
		if(key < a[mid])              //如果采用飞的分法,前面有F(k-1)个数
		{                              //那么下标mid = low + F(k-1) -1
			high = mid -1;
			k = k -1;
		}
		else if(key >a[mid])              //后面剩的数的个数就是F(k-2)个
		{
			low = mid + 1;
			k = k - 2;
		}
		else
		{
			if (mid <= n)
				return mid;
			else
				return n;
		}
	}

	return 0;
}

int main()
{
	int a[10] = {1, 4, 8, 11, 24, 345, 567, 789, 999, 1234};
	int reValue = Fibonacci_Search(a, 10, 24);
	printf("%d", reValue);
	return 0;
}
  这种算法,在求下标的时候,只有加减发的运算,适合与较大数据的处理!

转载于:https://my.oschina.net/fsxchen/blog/119311

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值