顺序查找
int Search_Seq01(SSTable ST,KeyType key)
{
for(int i=ST.length;i>=1;i--)
if(ST.R[i].key==key) return i;
return 0;
}
设置监视哨的顺序查找
int Search_Seq02(SSTable ST,KeyType key)
{
int i;
ST.R[0].key = key;
for(i=ST.length;ST.R[i].key!=key;i--);
return i;
}
非递归折半查找
int Search_Bin01(SSTable ST,KeyType key)
{
int low=1,high=ST.length,mid;
while(low<=high)
{
mid=(low+high)/2;
if(ST.R[mid].key==key) return mid;
else if(ST.R[mid].key>key) high = mid-1;
else low = mid + 1;
}
return 0;
}
递归折半查找
int Search_Bin02(SSTable ST,KeyType key,int low,int high)
{
int mid = (low+high)/2;
if(ST.R[mid].key==key) return mid;
else if(ST.R[mid].key>key) Search_Bin02(ST,key,low,mid-1);
else Search_Bin02(ST,key,mid+1,high);
}
代码整合测试
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int KeyType;
typedef int InfoType;
typedef struct
{
KeyType key;
InfoType otherInfo;
}ElemType;
typedef struct
{
ElemType *R;
int length;
}SSTable;
Status InitTable(SSTable *ST)
{
ST->R = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
if(ST->R == NULL) return ERROR;
ST->length =0;
return OK;
}
int Search_Seq01(SSTable ST,KeyType key)
{
for(int i=ST.length;i>=1;i--)
if(ST.R[i].key==key) return i;
return 0;
}
int Search_Seq02(SSTable ST,KeyType key)
{
int i;
ST.R[0].key = key;
for(i=ST.length;ST.R[i].key!=key;i--);
return i;
}
int Search_Bin01(SSTable ST,KeyType key)
{
int low=1,high=ST.length,mid;
while(low<=high)
{
mid=(low+high)/2;
if(ST.R[mid].key==key) return mid;
else if(ST.R[mid].key>key) high = mid-1;
else low = mid + 1;
}
return 0;
}
int Search_Bin02(SSTable ST,KeyType key,int low,int high)
{
int mid = (low+high)/2;
if(ST.R[mid].key==key) return mid;
else if(ST.R[mid].key>key) Search_Bin02(ST,key,low,mid-1);
else Search_Bin02(ST,key,mid+1,high);
}
int main()
{
SSTable ST;
InitTable(&ST);
for(int i=1;i<=20;i++)
{
ST.R[i].key = i;
ST.length+=1;
}
printf("%d\n",ST.R[Search_Seq02(ST,2)].key);
printf("%d\n",Search_Seq01(ST,3));
printf("%d\n",Search_Bin01(ST,9));
printf("%d",Search_Bin02(ST,14,1,20));
return 0;
}