查找的定义是:给定一个值k, 在含有n个记录的表中找出关键字等于k的记录。若找到,则查找成功,返回该记录的信息或该记录在表中的位置;否则查找失败,返回相关的指示信息。
采用何种查找方法的相关因素如下:
(a) 使用哪种数据结构来表示”表”,即表中记录是按何种方式组织的。
(b) 表中关键字的次序,即对无序集合查找还是对有序集查找。
若在查找的同时对表做修改运算(如插入和删除),则相应的表称之为动态查找表,否则称之为静态查找表。
查找也有内查找和外查找之分。若整个查找过程都在内存进行,则称之为内查找;反之,若查找过程中需要访问外存,则称之为外查找。
由于查找运算的主要运算是关键字的比较,所以通常把查找过程中对关键字需要执行的平均比较次数(也称为平均查找长度)作为衡量一个查找算法效率优劣的标准。平均查找长度ASL(Average Search Length)定义为:
其中,n是查找表中记录的个数,pi是查找第i个记录的概率,一般地,均认为每个记录的查找概率相等,即
查找与数据的存储结构有关,线性表有顺序和链式两种存储结构。这里介绍以顺序表作为存储结构是实现的顺序查找算法。定义被查找的顺序表类型定义如下:
#define MAXL 100
typedef int KeyType;
typedef char InfoType[10];
typedef struct{
KeyType key; //KeyType为关键字的数据类型
InfoType data; //其他数据
}NodeType;
typedef NodeType SeqList[MAXL]; //顺序表类型
线性表的查找主要分为:顺序查找、二分查找和分块查找。
顺序查找是一种简单的查找方法。它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。算法如下:
int SeqSearch(SeqList R,int n,KeyType k){
int i=0;
while (i<n && R[i].key!=k) //从前往后找,边扫描边输出
{
printf("%d ",R[i].key);
i++;
}
if(i>=n)
return -1;
else{
printf("%d",R[i].key);
return i;
}
}
查找成功时,顺序表的平均查找长度为:
即顺序表的时间复杂度为O(n)。
完整代码如下:
#include <stdio.h>
#define MAXL 100
typedef int KeyType;
typedef char InfoType[10];
typedef struct{
KeyType key; //KeyType为关键字的数据类型
InfoType data; //其他数据
}NodeType;
typedef NodeType SeqList[MAXL]; //顺序表类型
int SeqSearch(SeqList R,int n,KeyType k){
int i=0;
while (i<n && R[i].key!=k) //从前往后找,边扫描边输出
{
printf("%d ",R[i].key);
i++;
}
if(i>=n)
return -1;
else{
printf("%d",R[i].key);
return i;
}
}
void main()
{
SeqList R;
int n=10;
KeyType k=5;
int a[]={3,6,2,10,1,8,5,7,4,9},i;
for(i=0;i<n;i++)
R[i].key=a[i];
printf("\n");
if((i=SeqSearch(R,n,k))!=-1)
printf("\n元素%d的位置是%d\n",k,i);
else
printf("\n元素%d不在表中\n",k);
printf("\n");
}
效果如下:
