顺序查找
是将表中记录(R1 R2……Rn)按其序号存储于一维数组空间,设给定值为k,在表(R1 R2……Rn)中,从R(n)开始,n–查找R(n)=k的记录;
(而言之就是:一个一个找,知道找到为止);
优点:简单易懂;
缺点:效率很低;
具体代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int data_t;
typedef struct{
data_t *data;
int maxlen;
int last;
}sq,*linlist;
int main(){
int i,j;
/*creart sq*/
printf("input sq maxlen:");
linlist S;
S = (linlist)malloc(sizeof(sq));
S->last = -1;
scanf("%d",&i);
S->maxlen = i;
S->data = (data_t *)malloc(S->maxlen * sizeof(data_t));
memset(S->data,0,(S->maxlen * sizeof(data_t)));
/*insert sq*/
printf("input sq data");
i = 0;
while((S->maxlen - 1) != S->last){
scanf("%d",&i);
if(i == -1){
break;
}
S->data[(S->last + 1)] = i;
S->last++;
}
/*show sq*/
i = 0;
while(i <= S->last){
printf("%d",S->data[i]);
i++;
}
puts("");
/*find "i" in sq*/
i = 0;
while(i != -1){
printf("input find data");
scanf("%d",&i);
j = S->last;
while(j >= 0){
if(i == S->data[j]){
printf("%d\n",j);
break;
}
j--;
}
if(j < 0){
printf("find data don't in sq\n");
}
}
/*free sq*/
free(S->data);
S->data = NULL;
free(S);
S = NULL;
return 0;
}
代码运行结果
input sq maxlen:5
input sq data
1
2
3
4
5
12345
input find data:4
find data 4 in sq set is 3
input find data:10
find data don't in sq
折半查找
对给定值k,逐步确定待查记录所在区间,每次将搜索空间减少一半(折半),直到查找成功或失败为止。
设两个游标low、high,分别指向当前待查找表的上界(表头)和下界(表尾)。mid指向中间元素。
优点:效率有所提高;
缺点:要求存储的数据有序;
具体代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int data_t;
typedef struct{
data_t *data;
int maxlen;
int last;
}sq,*linlist;
int main(){
int i,low,high,min;
/*creart sq*/
printf("input sq maxlen:");
linlist S;
S = (linlist)malloc(sizeof(sq));
S->last = -1;
scanf("%d",&i);
S->maxlen = i;
S->data = (data_t *)malloc(S->maxlen * sizeof(data_t));
memset(S->data,0,(S->maxlen * sizeof(data_t)));
/*insert sq*/
printf("input sq data");
i = 0;
while((S->maxlen - 1) != S->last){
scanf("%d",&i);
if(i == -1){
break;
}
S->data[(S->last + 1)] = i;
S->last++;
}
/*show sq*/
i = 0;
while(i <= S->last){
printf("%d",S->data[i]);
i++;
}
puts("");
/*find i in sq*/
i = 0;
scanf("%d",&i);
low = 0;
high = S->last;
// min = (high - low)/2;
while(low <= high){
min =(high + low)/2;
if(i == S->data[min]){
printf("%d\n",min);
break;
}
else if( S->data[min] > i){
high = min-1;
}
else{
low = min+1;
}
}
if(low > high){
printf("sq don't data\n");
}
/*free sq*/
free(S->data);
S->data = NULL;
free(S);
S = NULL;
return 0;
}
代码运行结果
input sq maxlen:5
input sq data:
2
4
6
8
10
2,4,6,8,10,
input will find data
10
10 in the sq set is 4
input sq maxlen:5
input sq data:
2
4
6
8
10
2,4,6,8,10,
input will find data
20
sq don't data
代码不足之处较多,还请各位指教。