6.2 顺序查找与折半查找
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
typedef struct{
ElemType *elem;
int TableLen;
}SSTable;
int Search_Seq(SSTable ST,ElemType key)
{
ST.elem[0]=key;
int i;
for(i=ST.TableLen-1;ST.elem[i]!=key;--i);
return i;
}
void ST_Init(SSTable &ST,int len)
{
ST.TableLen=len+1;
ST.elem=(ElemType *)malloc(sizeof(ElemType)*ST.TableLen);
int i;
srand(time(NULL));
for(i=0;i<ST.TableLen;i++)
{
ST.elem[i]=rand()%100;
}
}
void ST_print(SSTable ST)
{
for(int i=0;i<ST.TableLen;i++)
{
printf("%3d",ST.elem[i]);
}
printf("\n");
}
int Binary_Search(SSTable L,ElemType key)
{
int low=0,high=L.TableLen-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(L.elem[mid]==key)
return mid;
else if(L.elem[mid]>key)
high=mid-1;
else
low=mid+1;
}
return -1;
}
int compare(const void *left,const void *right)
{
return *(ElemType*)left-*(ElemType*)right;
}
int main()
{
SSTable ST;
ElemType key;
int pos;
ST_Init(ST,10);
ST_print(ST);
printf("请输入要搜索的key值:\n");
scanf("%d",&key);
pos=Search_Seq(ST,key);
if(pos)
{
printf("查找成功 位置为 %d\n",pos);
}else{
printf("查找失败\n");
}
qsort(ST.elem,ST.TableLen,sizeof(int),compare);
ST_print(ST);
printf("二分查找,请输入要搜索的key值:\n");
scanf("%d",&key);
pos=Binary_Search(ST,key);
if(pos!=-1)
{
printf("查找成功 位置为 %d\n",pos);
}else{
printf("查找失败\n");
}
system("pause");
}
6.5 字符串模式匹配
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char* SString;
int Index(SString S,SString T)
{
int i=1,j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
{
++i,++j;
}else{
i=i-j+2;j=1;
}
}
if(j>T[0]) return i-T[0];
else return 0;
}
void get_next(char T[],int next[])
{
int i=1;
next[1]=0;
int j=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
++i;++j;
next[i]=j;
}else{
j=next[j];
}
}
}
int KMP(char S[],char T[],int next[],int pos)
{
int i=pos;
int j=1;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j]){
++i;
++j;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
int main()
{
char S[256];
char T[10];
int next[10];
int pos;
S[0]=strlen("abcabaaabaabcac");
strcpy(S+1,"abcabaaabaabcac");
T[0]=strlen("abaabcac");
strcpy(T+1,"abaabcac");
pos=Index(S,T);
if(pos)
{
printf("匹配成功,位置为%d\n",pos);
}else{
printf("未匹配\n");
}
get_next(T,next);
pos=KMP(S,T,next,1);
if(pos)
{
printf("匹配成功,位置为%d\n",pos);
}else{
printf("未匹配\n");
}
system("pause");
}
7.4散列表