折半查找的递归算法 | 二分查找 | C语言代码完整版

目录

一.前提

二.算法步骤

三.算法描述

四.完整代码

五.结果


一.前提

线性表必须是采用顺序存储结构,而且表中的元素按关键字排列有序。

二.算法步骤

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;

}

五.结果

 

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值