【算法基础】基础查找算法

    最近在准备实习,感觉数据结构跟算法这一块每个公司都很看重,大二粗略学过了一遍,虽然最后拿的分数也不低算是入门比较好,但是毕竟过了一年了,很多都忘光,趁着博客刚开,边复习边贴上来,正好让大家评判一下错误。

    1.顺序表查找

顺序表查找是最基本的查找技术,从第一个(最后一个)元素开始往前(往后)查找,找到对应的元素值则返回下标,查找不成功返回失败。

    a.顺序查找

/*顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字*/
int Sequential_Search(int *a, int n, int key)
{
	int i;
	for(i=1; i<=n; i++)
	{
		if( key == a[i] )
			return i;
	}
	return 0;
}

b.有哨兵的顺序查找

/*带哨兵的顺序查找*/
int Sequential_Search1(int *a, int n, int key)
{
	a[0] = key;
	int i = n;
	while( key != a[i] )
	{
		i--;

	}
	return i;
}

一开始我也不清楚,带个哨兵就能提高效率,但是仔细一看,确实,a查找算法中需要进行多次比较,但是,由于b查找算法从n开始递减,不用比较i与n的关系,对于大量数据的处理,确实能提高较多的效率。


2.有序表查找

有序表顾名思义就是对一个有序的表进行查找

a.折半查找(二分查找)

/*折半查找*/

int Binary_Search(int *n, int n, int key)
{
	int low,high,mid;
	low = 1 ;
	high = n;
	while(low <= high)
	{
		mid = ( low + high ) / 2;
		if( key > a[mid] )
			low = mid + 1;
		else if( key < a[mid] )
			high = mid - 1;
		else 
			return mid;
	}
	return 0;
}

b.插值查找

如果一个数组有1000个元素{0,1,2,3,4,95,96,97,98,99,100,101...},若要在这个数组中查找元素1,如果折中查找,那岂不是要很久?基于这个原因,我们可以对折半查找进行改进,不一定每次都要折半,也可以折三分之一,四分之一,五分之一等?那究竟数值取决于哪里?没错,要根据我们所要查找的值在我们的数组区间内的大概范围内。我们先拿数组的最大值减去最小值 a[high]-a[low]得到数组的范围区间,然后拿我们所要寻找的key值,对最小值做差key-a[low],再用后者除以前者,即(key-a[low])/[a[high]-a[low]],这样,我们就得到了对应key值在数组区间内的大概位置,可是,我们是要求下标的递增,那怎么办?没错,只需要拿我们的数组元素的总数,乘以上面所求到的key值对应在数组区间的范围,也就是(high-low)*(key-a[low])/[a[high]-a[low]],便可以精确的得到基于查找值key的一个增量查找了。所以,最终我们只需要对上面折半查找的代码的mid = (low+high) / 2;这行代码进行修改,便可以得出代码如下:


/*基于key值的n分查找*/

int Binary_Search1(int *n, int n, int key)
{
	int low,high,mid;
	low = 1 ;
	high = n;
	while(low <= high)
	{
		mid = low + (high-low) * (key-a[low])/(a[high] - a[low])
		if( key > a[mid] )
			low = mid + 1;
		else if( key < a[mid] )
			high = mid - 1;
		else 
			return mid;
	}
	return 0;
}








附注:以上所有源代码均参考--《大话数据结构》。
语言由本人参考自主组织,有错误之处,欢迎指出。
另真诚推荐该书,非常适合数据结构入门。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值