目录
一.前提
线性表必须是采用顺序存储结构,而且表中的元素按关键字排列有序。
二.算法步骤
1.设置区间初始值,low=1,high=表长
2.当low<=high时,执行以下循环
(1) mid=(low+high)/ 2
(2) 比较key与中间位置记录的关键字是否相等
如果相等则返回mid;
如果不相等且key<中间位置记录的关键字,则high=mid-1;
如果不相等且key>中间位置记录的关键字,则low=mid+1;
3.循环结束,说明查找失败,return 0;
三.算法描述
int Search_Bin(SSTable *ST,ElemTypeKey key){
//在有序表ST中折半查找其关键字等于key的数据元素,如果找到则返回该元素的位置,否则返回0
int low=1,mid;
int high=ST->length;
if(low<=high)
{
mid=(low+high)/2;
if(key==ST.R[mid].key) return mid;
else if(key<ST.R[mid].key) high=mid-1;
else (key>ST.R[mid].key) low=mid+1;
}
else return 0;
}
四.完整代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElemTypeKey;
typedef struct{
ElemTypeKey key;
char info[20];//其它信息
}ElemType;
/*typedef int ElemType;*/
typedef struct {
ElemType *R; //表基址
int length; //表长
}SSTable;
SSTable *createSStable(int n){//创建一个含有n个元素的顺序表
int i;
SSTable *st=(SSTable *)malloc(sizeof(SSTable));//申请地址空间
if(st!=NULL){//申请空间成功
st->length=n;
st->R=(ElemType*)malloc(sizeof(ElemType)*(n+1));//预留哨兵位置 0
for(i=1;i<=n;i++)
st->R[i].key=i*i*i;//产生随机整数 ((int)rand())%1000
}
return st;
}
void display(SSTable* st) {//显示顺序表中元素关键字
int i;
if(st!=NULL){
for(i=1;i<=st->length;i++)
printf("%d\t",st->R[i].key);
}
}
int search_SSTable(SSTable *st,ElemTypeKey e){//简单查找,无哨兵 e是查找的关键字
int i;
if (st!=NULL){
for(i=1;i<=st->length;i++)
if(st->R[i].key==e) return i;
}
return 0;//st为空或者没找到
}
int search_SSTable1(SSTable *st,ElemTypeKey e){//简单查找,哨兵
int i;
if (st!=NULL){
st->R[0].key=e;//前哨,要求R中元素从1开始保存,即空出0位置
for(i=st->length;st->R[i].key!=e;i--)
;
return i;
}
return 0;//st为空
}
int search_SSTable2(SSTable *st,ElemTypeKey e){//简单查找,哨兵
int i;
if (st!=NULL){
st->R[st->length].key=e;//后哨 ,要求R中元素从0开始保存,即空出length位置
for(i=0;st->R[i].key!=e;i++)
;
return i;
}
return 0;//st为空
}
int Search_Bin(SSTable *ST,ElemTypeKey key){
//在有序表ST中折半查找其关键字等于key的数据元素,如果找到则返回该元素的位置,否则返回NULL
int low=1,mid;
int high=ST->length;
while(low<=high){
mid=(low+high)/2;
if(key==ST->R[mid].key) return mid;
else if(key<ST->R[mid].key) high=mid-1;//前一子表查找
else low=mid+1; //后一子表查找
}
return 0;
}
int Search_B(SSTable *st,ElemTypeKey key,int low,int high){
int mid;
if(low>high) return 0; //查找不到时返回0
mid=(low+high)/2;
if(key==st->R[mid].key) return mid;
else if(key<st->R[mid].key)
return Search_B(st,key,low,mid-1);//递归
else
return Search_B(st,key,mid+1,high);
}
int main() {
int n=10,pos;
SSTable *st=createSStable(n);
display(st);
printf("\n");
printf("\n");
pos=search_SSTable(st,512);
printf("元素512位置为%d\n",pos);
pos=search_SSTable1(st,-7);
printf("元素-7位置为%d\n",pos);
printf("元素27的位置=%d\n",Search_Bin(st,27));
printf("元素27的位置=%d\n",Search_B(st,27,1,st->length));
return 0;
}
五.结果