数据结构的线性表查找
文章目录
一、查找的概念
1.查找的定义
给定一个k的值,在含n元素的表中找出关键字等于k的元素。若找到,返回该元素在表中的位置,否则返回相关指示信息。
(1)静态查找:查找时不对表进行任何操作。
(2)动态查找:查找时同时对表进行修改。
2.查找的步骤
(1)弄清对象在计算机中存储的数据结构。
(2)对表中关键字的要求。
(3)对象的排序是有序的还是无序的。
3.平均查找长度
ASL=所有元素x进行比较的关键字次数的平均
ASL称为平均查找长度。
二、线性表的查找
关键字项相当于是数据项的索引。
typedef int KeyType; //定义关键字类型为int
typedef char InfoType;
typedef struct
{ KeyType key; //关键字项
InfoType data; //其他数据项,类型为InfoType
} RecType; //查找元素的类型
三、顺序查找
1.算法一
顺序查找比较直接,通过来回比较查找。
int SeqSearch(RecType R[],int n,KeyType k)
{
int i=0;
while (i<n && R[i].key!=k) //从表头往后找
i++;
if (i>=n)
return 0;
else
return i+1;
}
RecType R[],int n为顺序表数组传参。返回的位置是从1开始的。
2.算法二
数组R[]末位增加哨兵元素k,减少查找过程中的比较,从而提高查找速度。
int SeqSearch1(RecType R[],int n,KeyType k)
{
int i=0;
R[n].key=k;
while (R[i].key!=k) //从表头往后找
i++;
if (i==n) //未找到返回0
return 0;
else
return i+1; //找到返回逻辑序号i+1
}
3.算法分析
顺序查找法比较次数多,当n大时,不宜采用。
四、折半查找
1.折半查找的要求
要求线性表是有序表,即表中关键字有序。
2.原理
折半查找过程判定树。
3.算法
//折半查找算法
#include "seqlist.cpp"
int BinSearch(RecType R[],int n,KeyType k) //折半查找算法
{ int low=0,high=n-1,mid;
while (low<=high) //当前区间存在元素时循环
{ mid=(low+high)/2;
if (k==R[mid].key) //查找成功返回其逻辑序号mid+1
return mid+1;
if (k<R[mid].key) //继续在R[low..mid-1]中查找
high=mid-1;
else //k>R[mid].key
low=mid+1; //继续在R[mid+1..high]中查找
}
return 0; //未找到时返回0(查找失败)
}
当出现low大于等于high时,结束查找,即没有找到
4.算法分析
折半查找的时间复杂度为O(log2 n),折半查找需要有序的关键字表,还要确定查找的区间(low,high),因此存储的数据结构可以随机存取特性,所以该算法只适用顺序表。