试将折半查找的算法改写成递归算法

试将折半查找的算法改写成递归算法
[输入]
关键字序列,要查找的关键字key
[输出]
输出一个初始化后顺序查找表,关键字key对应的记录的位置
存储结构:
线性存储
算法的基本思想:
折半查找:递归算法,用下标low和high分别标记查找区间的两端,mid为区间中间点位置,如果要查找关键字等于中间点位置关键字,则查找成功,返回关键字对应记录的位置,如果要查找关键字大于中间点位置关键字,则修改low=mid+1,继续查找,否则修改high=mid-1并继续查找,若low大于high,则查找不成功,返回0;输出记录位置。

源程序

#include <bits/stdc++.h>

int Search(int* a, int k, int low, int hight) 
{
    int mid;
    if (low > hight) 
    {
        return 0;
    }
    mid = (low + hight) / 2;
    if (a[mid] == k) 
    {
        return (mid + 1);
    }
    else if (a[mid] > k)
    {
        return Search(a, k, low, mid - 1);
    }
    else 
    {
        return Search(a, k, mid + 1, hight);
    }
}

int main() 
{
    system("color f0");
    int i, n, key, position;
    printf("你有多少个数据要输入:\n");
    scanf("%d", &n);
    int p[n];
    printf("请按递增序列输入你的数据(整型变量):\n");
    scanf("%d", &p[0]);
    for (i = 1; i < n; i++) 
    {
            scanf("%d", &p[i]);
        while (p[i] < p[i - 1])
        {
            printf("你输入的数据不合理,请重新输入:\n");
            scanf("%d", &p[i]);
        }
    }
    printf("请输入你要查找的数据:\n");
    scanf("%d", &key);
    position = Search(p, key, 0, n - 1);
    if (position == 0) 
    {
        printf("没有找到你要查找的数据!\n");
    }
    else
    {
        printf("你所查找的数据位于原有序表的第%d个位置!\n", position);

    }
    system("pause");
    return 0;
}

在这里插入图片描述

该程序实现的功能完整地满足了题目的所有要求,但一些方面还可以优化。其时间复杂度为O(logn),空间上没有使用辅助空间。
注意折半查找查找失败的条件是low大于high;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@小冯@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值