二分查找法和顺序查找的实现
二分査找
二分査找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字 key 进行比较,若相等,则査找成功;若 key 值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找:若key值比该关键宇值小,则要找的元素一定在左子表中,继续对左子表进行折半査找。如此递推,直到査找成功或査找失败(或査找范围为 0)
int binary_search(int key,int a[],int n) //自定义函数binary_search(){int low,high,mid,count=0,count1=0;low=0;high=n-1;while(low<high) //査找范围不为0时执行循环体语句{count++; //count记录査找次数mid=(low+high)/2; //求中间位置if(key<a[mid]) //key小于中间值时high=mid-1; //确定左子表范围else if(key>a[mid]) //key 大于中间值时low=mid+1; //确定右子表范围else if(key==a[mid]) //当key等于中间值时,证明查找成功{printf("查找成功!\n 查找 %d 次!a[%d]=%d",count,mid,key); //输出査找次数及所査找元素在数组中的位置count1++; //count1记录查找成功次数break;}}if(count1==0) //判断是否查找失敗printf("查找失敗!"); //査找失敗输出no foundreturn 0;}int main(){int i,key,a[100],n;printf("请输入数组的长度:\n");scanf("%d",&n); //输入数组元素个数printf("请输入数组元素:\n");for(i=0;i<n;i++)scanf("%d",&a[i]); //输入有序数列到数组a中printf("请输入你想查找的元素:\n");scanf("%d",&key); //输入要^找的关键字binary_search(key,a,n); //调用自定义函数printf("\n");return 0;
顺序查找
静态查找表用顺序存储结构表示时,顺序查找的查找过程为:从表中的最后一个数据元素开始,逐个同记录的关键字做比较,如果匹配成功,则查找成功;反之,如果直到表中第一个关键字查找完也没有成功匹配,则查找失败。
typedef struct {keyType key;//查找表中每个数据元素的值//如果需要,还可以添加其他属性}ElemType;typedef struct{ElemType *elem;//存放查找表中数据元素的数组int length;//记录查找表中数据的总数量}SSTable;//创建查找表void Create(SSTable **st,int length){(*st)=(SSTable*)malloc(sizeof(SSTable));(*st)->length=length;(*st)->elem =(ElemType*)malloc((length+1)*sizeof(ElemType));printf("输入表中的数据元素:\n");//根据查找表中数据元素的总长度,在存储时,从数组下标为 1 的空间开始存储数据for (int i=1; i<=length; i++) {scanf("%d",&((*st)->elem[i].key));}}//查找表查找的功能函数,其中key为关键字int Search_seq(SSTable *st,keyType key){st->elem[0].key=key;//将关键字作为一个数据元素存放到查找表的第一个位置,起监视哨的作用int i=st->length;//从查找表的最后一个数据元素依次遍历,一直遍历到数组下标为0while (st->elem[i].key!=key) {i--;}//如果 i=0,说明查找失败;反之,返回的是含有关键字key的数据元素在查找表中的位置return i;}int main() {SSTable *st;Create(&st, 6);getchar();printf("请输入查找数据的关键字:\n");int key;scanf("%d",&key);int location=Search_seq(st, key);if (location==0) {printf("查找失败");}else{printf("数据在查找表中的位置为:%d",location);}return 0;}
可运行代码中设置了一个固定长度为 6 的顺序表,例如在查找表为{1,2,3,4,5,6}找到关键字为 1 的数据元素的位置,则运行效果为:
输入表中的数据元素:1 2 3 4 5 6请输入查找数据的关键字:2数据在查找表中的位置为:2
同时,在程序中初始化创建查找表时,由于是顺序存储,所以将所有的数据元素存储在数组中,但是把第一个位置留给了用户用于查找的关键字。例如,在顺序表{1,2,3,4,5,6}中查找数据元素值为 7 的元素,则添加后的顺序表为:
顺序表的一端添加用户用于搜索的关键字,称作“监视哨”。
图中监视哨的位置也可放在数据元素 6 的后面(这种情况下,整个查找的顺序应有逆向查找改为顺序查找)。
放置好监视哨之后,顺序表遍历从没有监视哨的一端依次进行,如果查找表中有用户需要的数据,则程序输出该位置;反之,程序会运行至监视哨,此时匹配成功,程序停止运行,但是结果是查找失败。
推荐一个C语言中文学习网站:
http://c.biancheng.net/
海量教程源码应有尽有~;
