对有序表进行折半查找的非递归算法

//请写出对有序表进行折半查找的非递归算法,并将对应的程序调试运行通过
#include<stdio.h>
#include<stdlib.h>
#define N 100
typedef int Status;
typedef int ElemType;

typedef struct {//创建有序表
    ElemType *list;
    int length;
}SqList;

Status Creat_SearchTable(SqList &st){//创建查找表
    ElemType a[N];
    printf("请输入您要输入的数据总数:(不大于100)");
    scanf("%d",&st.length);
    st.list=(ElemType*)malloc(st.length*sizeof(ElemType));
    if(!st.list)
        exit(-1);
    for(int i=0;i<st.length;i++){
        printf("请输入第%d个数据",i+1);
        scanf("%d",&a[i]);
    }
    int j,k,t,p;
    for(j=0;j<st.length-1;j++){//选择法对数据进行排序
        p=j;
        for(k=j;k<st.length;k++){
            if(a[k]<a[p])
                p=k;
            t=a[p];a[p]=a[j];a[j]=t;
        }
    }
    for(int i=0;i<st.length;i++){//把已经排好序的数据放入表中
        st.list[i]=a[i];
    }
}
Status Binary_Search(SqList st,ElemType key){//非递归的折半查找
    int low,mid,high;
    low=0;high=st.length-1;
    while(low<=high){
        mid=(low+high)/2;
        if(key==st.list[mid])
            return mid;
        else if(key<st.list[mid])
            high=mid-1;
        else
            low=mid+1;
    }
    return 0;
}
Status Binary_Search_recur(SqList st,int low,int high,ElemType key){
    //递归的折半查找
    int mid=(low+high)/2;
    if(low>high)
        return 0;
    if(key==st.list[mid])
        return mid;
    else if(key<st.list[mid])
        Binary_Search_recur(st,low,mid-1,key);
    else
        Binary_Search_recur(st,mid+1,high,key);
}
int main(){
    ElemType key;
    int flag,p=0;
    SqList st;
    if(!Creat_SearchTable(st))
        return 0;
    printf("请输入您要查找的数据:");
    scanf("%d",&key);
    while(!p){
        printf("请选择您想使用的折半查找方式,“1”代表非递归的折半查找方式,“2”表示递归的折半查找方式。“0”表示退出");
            scanf("%d",&flag);
        if(flag==0||flag==1||flag==2)p=1;
    }
    if(flag=1){
        if(!Binary_Search(st,key))
            printf("您要查找的数据不存在");
        else
            printf("值为%d的数据在表中",key);
        }
    if(flag=2){
        if(!Binary_Search_recur(st,0,st.length,key))
            printf("您要查找的数据不存在");
        else
            printf("值为%d的数据在表中",key);
    }
    system("pause");
    return 0;
}
  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值