###1、顺序查找的概念 顺序查找(Sequential Search)是最简单的一种查找方法。其基本思想是:从线性表的一端开始,依次将每一个记录的关键字与给定值进行比较,若某个记录的关键字等于给定值,表示查找成功,返回记录序号;若将线性表中全部记录都比较完,仍未找到关键字与给定值相等的记录,则表示查找失败,返回一个查找失败的标志值算法
###2、顺序查找的实现 ####顺序查找数组
/** *简单的顺序查找 * */ int SeqSearch(int s[], int n, int key) { int i; for (i=0; i<n && s[i]!=key; i++) //循环查找关键字 ; // 空循环 if (i<n) //查找成功,返回序号 return i; else //查找失败,返回失败值 return -1; }
####顺序查找测试函数
#include <stdio.h> #include "SeqSearch.c" #define ARRAYLEN 8 int main() { int key, i, pos; int source[ARRAYLEN] = {69, 65, 90, 37, 92, 6, 2}; printf("请输入查找关键字:"); scanf("%d", &key); pos = SeqSearch(source, ARRAYLEN, key); printf("原数据:"); for (i=0; i< ARRAYLEN; i++) printf("%d ", source[i]); printf("\n"); if (pos > 0) printf("查找成功,关键字%d位于数组的第%d个位置\n", key, pos); else printf("查找成功,关键字%d不在数组中\n", key); }
###3、顺序查找简单优化 在以上的SeqSearch函数中,第7~8行是顺序查找的主要部分,在这部分循环语句中,每循环一次 都须要进行两个比较(i<n和r[i]!=key),若是静态查找表中的数据不少,两次比较则须要进行较长时间,程序的效率会显著下降。这时,可对SeqSearch算法进行改进,在建立静态查找表时,在该表的末端增长一个空的单元,用来保存查找的关键字。这样,确保静态查找表中有一个与查找关键字相同的数据,就不须要使用条件i<n进行判断了。每次查找时,查找表中老是能找到关键字,怎样判断是否查找成功呢?其实,只须要判断,如果找了n+1个元素才找到关键值,则表示查找失败测试
####SeqSearch函数优化优化
int SeqSearch(int s[], int n, int key) { int i; for (i=0; s[i]!=key; i++) //循环查找关键字 ; // 空循环 if (i<n) //查找成功,返回序号 return i; else //查找失败,返回失败值 return -1; }
####SeqSearch函数优化后测试code
#include <stdio.h> #include "SeqSearch.c" #define ARRAYLEN 8 int main() { int key, i, pos; int source[ARRAYLEN+1] = {69, 65, 90, 37, 92, 6, 2}; printf("请输入查找关键字:"); scanf("%d", &key); source[ARRAYLEN+1] = key; pos = SeqSearch1(source, ARRAYLEN+1, key); printf("原数据:"); for (i=0; i< ARRAYLEN; i++) printf("%d ", source[i]); printf("\n"); if (pos >= 0) printf("查找成功,关键字%d位于数组的第%d个位置\n", key, pos); else printf("查找失败,关键字%d不在数组中\n", key); }
###4、顺序查找的特色 优势:对静态查找表中数据的顺序没有要求。若须要建立动态查找表,能够方便地将查找不成功的数据添加到查找表的末尾。 缺点:速度慢,在最坏的状况下,查找成功须要进行n次比较,查找失败须要进行n+1次比较。io