[数据结构]查找

查找概念

查找表:由同一类型的数据元素构成的集合。

查找表按照操作的方式分为两大种:静态查找表和动态查找表。

静态查找表:只作查找操作的查找表,它的主要的操作有:

查找某个“特定的数据元素”

动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。动态查找表的操作:

查找时插入数据和查找时删除数据

对于静态查找表来说,可以应用线性表结构来组织数据,这样可以使用顺序查找算法。如果再对主关键字排序,则可以应用折半查找等技术进行高效的查找。

对于动态查找,则要考虑二叉排序树的查找技术。

静态表查找

顺序表查找

顺序查找:从表中的第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,如果某个记录的关键字和给定值相等,则查找成功。如果直到最后一个(或第一个)记录,其关键字和给定值比较都不相等,则查找不成功。

int Sequential_Search(int *a, int n, int key)
{
	int i;
	for(i = 1; i <= n; i++)
	{
		if(a[i] == key)
		{
			return i;
		}
	}//for
	
	return 0;
}

但是这个算法是可以改进的,上面看到每向后移动一个元素后,都要比较当前的索引和数组的个数,防止越界。事实上,可以设置一个哨兵,这样就不需要每次让i与n作比较了。

/*有哨兵的顺序查找,查找成功返回下标,不成功返回0*/
int Sequential_Search2(int *a, int n, int key)
{
	int i = n;
	a[0] = key;	//设置a[0]为关键字,称之为哨兵
	
	while(a[i] != key)
	{
		i--;
	}
	
	return i;
}

  这种在查找方向的尽头设置哨兵的方法,避免了在查找过程中每次比较后都要判断查找位置是否越界。在数据量较多时,效率提高很大,是非常好的编程技巧。

折半查找

有序表中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功。若给定值小于中间记录,则在中间记录的左半区继续查找;若给定值大于中间记录,则在右半区查找。

posted @ 2015-05-04 21:09  stemon  阅读(260)  评论(0编辑  收藏  举报