zoukankan      html  css  js  c++  java
  • 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;
    }
     
  • 相关阅读:
    php RabbitMQ使用
    phalcon: 开启模板缓存和缓存路径
    phalcon:整合官方多模块功能,方便多表查询
    mysql: 模糊查询 feild like keyword or feild like keyword , concat(feild1,feild2,feild3) like keyword
    php的http数据传输get/post...
    java大数字操作:BigInteger,BigDecimal(浮点型)
    DecimalFormat数据格式函数
    MySQL比like语句更高效的写法locate position instr find_in_set
    mysql中使用instr替换like
    mysql中的多行查询结果合并成一个
  • 原文地址:https://www.cnblogs.com/zengguoqiang/p/8393185.html
Copyright © 2011-2022 走看看