查找->静态查找表->顺序查找(顺序表)
文字描述
顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。
示意图
略
算法分析
从顺序查找的过程看,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
代码实现
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define EQ(a, b) ((a) == (b)) 5 #define LT(a, b) ((a) < (b)) 6 #define LQ(a, b) ((a) <= (b)) 7 #define MAX_SIZE 50 8 #define DEBUG 9 10 typedef int KeyType; 11 typedef char InfoType; 12 /*数据元素类型定义*/ 13 typedef struct{ 14 //关键字域 15 KeyType key; 16 //其他域 17 InfoType otherinfo; 18 }ElemType; 19 /*静态查找表的顺序存储结构*/ 20 typedef struct{ 21 //数据元素存储空间基址,建表时按实际长度分配,0号单元留空 22 ElemType *elem; 23 //表长度 24 int length; 25 }SSTable; 26 27 /*顺序查找算法 28 * 29 *在顺序表ST中顺序查找其关键字等于key的数据元素。 30 *若找到,则函数值为该元素在表中的位置,否则为0 31 */ 32 int Search_Seq(SSTable ST, KeyType key){ 33 //哨兵 34 ST.elem[0].key = key; 35 int i = 0; 36 //从后往前找 37 for(i=ST.length; !EQ(ST.elem[i].key, key); --i); 38 //找不到时i为0 39 return i; 40 } 41 42 //顺序打印顺序表中的数据元素 43 void print_Seq(SSTable ST){ 44 int i = 0; 45 for(i=1; i<= ST.length; i++){ 46 printf("[%d]=%d/%c; ", i, ST.elem[i].key, ST.elem[i].otherinfo); 47 } 48 printf("\n"); 49 } 50 51 int main(int argc, char *argv[]) 52 { 53 int i = 0, loc = 0, key=0; 54 ElemType arr[MAX_SIZE+1] = {0}; 55 for(i=1; i<argc; i++){ 56 arr[i].key = atoi(argv[i]); 57 arr[i].otherinfo = 'a'+i-1; 58 } 59 SSTable ST; 60 ST.length = i-1; 61 ST.elem = arr; 62 #ifdef DEBUG 63 printf("输入了数据:"); 64 print_Seq(ST); 65 #endif 66 while(1){ 67 printf("输入待查找的key值(负值表示结束):"); 68 scanf("%d", &key); 69 if(key < 0) 70 break; 71 loc = Search_Seq(ST, key); 72 printf("key值为%d的位置在%d\n", key, loc); 73 } 74 return 0; 75 }
运行
posted on 2018-08-13 18:11 LiveWithACat 阅读(1182) 评论(0) 编辑 收藏 举报