文字描述
顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。
示意图
略
算法分析
从顺序查找的过程看,Ci取决于所查记录在表中的位置。如:查找表中最后一个记录时,仅需比较一次,Ci为1;而查找表中第一个记录时,需比较n次,Ci为n。一般情况下Ci等于n-i+1。
假设每个记录的查找概率相等,且每次都能查找成功,则平均查找长度为:
(1/n) * [n(n+1)/2] = (n+1)/2
假设考虑查找不成功的可能性,每个记录的查找概率也相等,则平均查找长度为:
(1/2n) * [n(n+1)/2] + (1/2n)*n*(n+1) = [3*(n+1)]/4
代码实现
#include <stdio.h>
#include <stdlib.h> #define EQ(a, b) ((a) == (b))
#define LT(a, b) ((a) < (b))
#define LQ(a, b) ((a) <= (b))
#define MAX_SIZE 50
#define DEBUG typedef int KeyType;
typedef char InfoType;
/*数据元素类型定义*/
typedef struct{
//关键字域
KeyType key;
//其他域
InfoType otherinfo;
}ElemType;
/*静态查找表的顺序存储结构*/
typedef struct{
//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
ElemType *elem;
//表长度
int length;
}SSTable; /*顺序查找算法
*
*在顺序表ST中顺序查找其关键字等于key的数据元素。
*若找到,则函数值为该元素在表中的位置,否则为0
*/
int Search_Seq(SSTable ST, KeyType key){
//哨兵
ST.elem[].key = key;
int i = ;
//从后往前找
for(i=ST.length; !EQ(ST.elem[i].key, key); --i);
//找不到时i为0
return i;
} //顺序打印顺序表中的数据元素
void print_Seq(SSTable ST){
int i = ;
for(i=; i<= ST.length; i++){
printf("[%d]=%d/%c; ", i, ST.elem[i].key, ST.elem[i].otherinfo);
}
printf("\n");
} int main(int argc, char *argv[])
{
int i = , loc = , key=;
ElemType arr[MAX_SIZE+] = {};
for(i=; i<argc; i++){
arr[i].key = atoi(argv[i]);
arr[i].otherinfo = 'a'+i-;
}
SSTable ST;
ST.length = i-;
ST.elem = arr;
#ifdef DEBUG
printf("输入了数据:");
print_Seq(ST);
#endif
while(){
printf("输入待查找的key值(负值表示结束):");
scanf("%d", &key);
if(key < )
break;
loc = Search_Seq(ST, key);
printf("key值为%d的位置在%d\n", key, loc);
}
return ;
}
顺序查找(顺序表)
运行