您的位置:首页 > 理论基础 > 数据结构算法

【数据结构线性表查找】——顺序查找和折半查找详解和代码

2015-04-23 20:08 281 查看
前言

查找的定义是:给定一个值k,在含有n个记录的表中找出关键字等于k的记录。若找到,则查找成功,返回该记录的信息或该记录在表中的位置;否则查找失败,返回相关的指示信息。

采用哪一种查找方法,需要考虑两点

(1)使用哪种数据结构来表示“表”;

(2)是对无序集合查找还是对有序集合查找。

线性表

三种在线性表上进行查找的方法:

(1)顺序查找

(2) 二分查找

(3)分块查找

线性表有顺序和链式两种存储结构。本文介绍顺序表实现的顺序查找算法。

一、顺序查找

 顺序查找是一种最简单的查找方法。

 思路:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。

<span style="font-size:14px;">//顺序查找
//在顺序表R[0..n-1]中查找关键字为k的元素,成功时返回找到的元素的逻辑序号,失败时返回0
int SeqSearch(int a[],int n,int k)
{
	int i=0;
	while(i<n&&a[i]!=k)				//从表头往后找
		i++;
	if (i>=n)						//未找到返回0
		return 0;
	else							//找到返回逻辑序号i+1
		return i+1;
}</span>


二、算法分析
在等概率情况下,pi=1/n(1≤i≤n),故成功的平均查找长度为

(n+…+2+1)/n=(n+1)/2

即查找成功时的平均比较次数约为表长的一半。

若K值不在表中,则须进行n+1次比较之后才能确定查找失败。

顺序查找的优缺点:

 算法简单,查找效率低,因此,当n较大时不宜采用顺序查找。

三、折半查找(二分查找)

折半查找也称为二分查找,要求线性表中的节点必须己按关键字值的递增或递减顺序排列。

思路:首先用要查找的关键字k与中间位置的节点的关键字相比较,这个中间节点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间节点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的节点或者该线性表中没有这样的节点。

采用二分查找的数据只适合采用顺序存储结构,不适用于链式存储结构。

//二分查找
//在有序表R[0..n-1]中进行二分查找,成功时返回元素的逻辑序号,失败时返回0
int BinSearch(int R[],int n,int k)
{  
	int low=0,high=n-1,mid;
	while(low<=high)  //当前区间存在元素时循环
	{  
		mid=(low+high)/2;
		if (R[mid]==k)//查找成功返回其逻辑序号mid+1
			return mid+1;
		if (R[mid]>k)  //继续在R[low..mid-1]中查找
			high=mid-1;
		else
			low=mid+1;  //继续在R[mid+1..high]中查找
	}
	return 0;
}


也可以采用递归算法:

//二分查找
//采用递归算法:
int BinSearch1(int R[],int low,int high,int k)
{  
	int mid;
	if (low<=high)  //查找区间存在一个及以上元素
	{   
		mid=(low+high)/2;  //求中间位置
		if (R[mid]==k) //查找成功返回其逻辑序号mid+1
			return mid+1;
		if (R[mid]>k)  //在R[low..mid-1]中递归查找
			BinSearch1(R,low,mid-1,k);
		else    //在R[mid+1..high]中递归查找
			BinSearch1(R,mid+1,high,k);     
	}
   else
	   return 0;
}


四、算法分析(二分查找)

对于n个元素,二分查找,成功时最多的关键字比较次数为:log2(n+1)
不成功时关键字比较次数为:log2(n+1)。
二分查找的优缺点

  虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。

  二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。

  对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。

参考:
http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/chazhao/chazhao9.1.1.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: