这样查找效率高

这样查找效率高

时间: 1ms        内存:128M

描述:

  在n个整数构成的有序序列中,找到关键字key在序列中出现的位置。当key在序列中不出现时,输出No
为了提高查找效率,利用待查找序列有序的特征,程序使用“二分查找”的算法。二分查找的做法是:首先,将表中间位置记录的关键字与查找关键字key比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
在提示部分已经给出部分代码,将程序补充完整,并提交规定的部分。

输入:

先输入n个表示待查找的序列中的元素个数
再输入n个整数作为待查找序列,这些整数按从小到大的顺序排列
最后输入要查找的数key

输出:

输出key在序列出现的位置,若不出现,输出No

示例输入:

10
2 4 5 6 8 22 37 65 75 88
5

示例输出:

3

提示:

参考答案(内存最优[1092]):


#include <stdio.h>
#define SIZE 100
int find(int *, int, int);
int main( )
{
    int d[SIZE],i;
    int n,key,index;
    scanf("%d", &n);
    for(i=0;i<n;i++)
        scanf("%d", &d[i]);
    scanf("%d", &key);
    index=find(d,n,key);
    if(index >= 0)
        printf("%d\n", index+1);
    else
        printf("No\n");
    return 0;
}
int find(int *d, int n, int k)

{

    int low, high,mid,index=-1;

    low=0,high=n-1;

    while(low<=high)

    {

        mid=(high+low-1)/2;

        if(d[mid]==k)

        {

            index=mid;

            return index;

        }

       else if(k<d[mid])

           high=mid-1;

       else

           low=mid+1;

    }

    return index;

}

参考答案(时间最优[0]):


#include <stdio.h>
#define SIZE 100
int find(int *, int, int);
int main( )
{
    int d[SIZE],i;
    int n,key,index;
    scanf("%d", &n);
    for(i=0;i<n;i++)
        scanf("%d", &d[i]);
    scanf("%d", &key);
    index=find(d,n,key);
    if(index >= 0)
        printf("%d\n", index+1);
    else
        printf("No\n");
    return 0;
}
int find(int *d, int n, int k)

{
    int low, high,mid,index=-1;
    low=0,high=n-1;
    while(low<=high)
    {
        mid=(low+high)/2;

        if(d[mid]==k)
        {
            index=mid;
            break;

        }
       else if(d[mid]>k)
           high=mid-1;
       else
           low=mid+1;
    }
    return index;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注