• 6-10 二分查找


    6-10 二分查找(20 分)

    本题要求实现二分查找算法。

    函数接口定义:

    Position BinarySearch( List Tbl, ElementType K );
    

    其中List结构定义如下:

    typedef int Position;
    typedef struct LNode *List;
    struct LNode {
        ElementType Data[MAXSIZE];
        Position Last; /* 保存线性表中最后一个元素的位置 */
    };
    

    Tbl是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找KTbl中的位置,即数组下标(注意:元素从下标1开始存储)。找到则返回下标,否则返回一个特殊的失败标记NotFound

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXSIZE 10
    #define NotFound 0
    typedef int ElementType;
    
    typedef int Position;
    typedef struct LNode *List;
    struct LNode {
        ElementType Data[MAXSIZE];
        Position Last; /* 保存线性表中最后一个元素的位置 */
    };
    
    List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */
    Position BinarySearch( List Tbl, ElementType K );
    
    int main()
    {
        List Tbl;
        ElementType K;
        Position P;
    
        Tbl = ReadInput();
        scanf("%d", &K);
        P = BinarySearch( Tbl, K );
        printf("%d
    ", P);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    

    输入样例1:

    5
    12 31 55 89 101
    31
    

    输出样例1:

    2
    

    输入样例2:

    3
    26 78 233
    31
    

    输出样例2:

    0
    
    思路:典型二分。
    AC代码如下:
    Position BinarySearch(List Tbl, ElementType K)
    {
    //    if (K<Tbl->Data[1] || K>Tbl->Data[Tbl->Last])        //好神奇!加了这个倒是没有通过
    //        return NotFound;
    
        int head = 1, last = Tbl->Last;
        while (head <= last){
            int mid = (head + last) / 2;
    
            if (Tbl->Data[mid] == K)return mid;
            if (Tbl->Data[mid] > K)
                last = mid - 1;
            if (Tbl->Data[mid] < K)
                head = mid + 1;
        }
        return NotFound;
    }

    细节忽略代码如下:

    List ReadInput()
    {
        int n; scanf("%d", &n);
        List list = (List)malloc(sizeof(struct LNode));
        list->Last = n;
        for (int i = 1; i <= n; i++)
            scanf("%d", &list->Data[i]);
        return list;
    }
     
  • 相关阅读:
    MSER
    resize和reserve的区别
    Rect
    U盘文件或目录损坏且无法读取怎么解决
    信道估计
    ann
    仿射变换详解 warpAffine
    opencv新版本的数据结构
    大津法
    php红包
  • 原文地址:https://www.cnblogs.com/zengguoqiang/p/8393185.html
Copyright © 2020-2023  润新知