这道题的算法思想就是利用二分查找来缩短查找的时间。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LISTSIZE 20000
typedef struct{
int *elem;
int length;
int listsize;
}Sqlist;
int Initialist(Sqlist *L){
L->elem=(int *)malloc(LISTSIZE*sizeof(Sqlist));
if (!L->elem) exit(-1);
L->length=0;
L->listsize=LISTSIZE;
return 1;
}
int Insertlist(Sqlist *L,int i,int e){
if (i<1||i>L->length+1) printf("ERROR");
int *q=&(L->elem[i-1]);
int *p;
for (p=&(L->elem[L->length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
L->length++;
return 1;
}
int Querylist(Sqlist *A,int length,int a){/*利用二分查找进行比较*/
int i=0,j=length-1,mid;
while (i<=j){
mid=(i+j)/2;
if (a<A->elem[mid])
j=mid-1;
else if(a>A->elem[mid])
i=mid+1;
else if (a==A->elem[mid])
return (mid+1);
}
return -1;
}
int main(){
int i,j,n,m,d,k;
Sqlist A;
Initialist(&A);
Sqlist B;
Initialist(&B);
scanf("%d",&n);
for (i=1;i<=n;i++){
scanf("%d",&d);
Insertlist(&A,i,d);
}
scanf("%d",&m);
for (i=1;i<=m;i++){
scanf("%d",&d);
Insertlist(&B,i,d);
}
for (i=0;i<B.length;i++){
k=Querylist(&A,A.length,B.elem[i]);
if (k==-1){
if (i==B.length-1)
printf("No Found!");
else
printf("No Found!\n");
}
else{
if(i==B.length-1)
printf("%d",k);
else
printf("%d\n",k);
}
}
return 0;
}