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

前言

查找的定义是:给定一个值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

你可能感兴趣的:(数据结构,二分查找,递归,线性表,顺序查找)