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

本文介绍了数据结构中的线性表查找方法,包括顺序查找和二分查找。顺序查找简单易实现,但效率较低,平均查找长度约为表长的一半。而二分查找要求线性表有序,它利用递归或迭代实现,成功查找的平均比较次数为log2(n+1)。

411

被折叠的 条评论
为什么被折叠?



