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\n", 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;
}
 

原文地址:https://www.cnblogs.com/zengguoqiang/p/8393185.html

时间: 2024-10-10 13:08:19

6-10 二分查找的相关文章

9.10 二分查找 gcc makefile gdb调试

 二分查找的迭代和递归实现: #include <stdio.h> #include <stdlib.h> int find1(int *a, int low , int high , int key)//迭代二分查找 { int mid = 0; while (low <= high) { mid = (low+high)/2; if (a[mid] == key) return mid; else if (a[mid] < key) low = mid + 1; e

算法(第4版)-1.1.10 二分查找

总结:本小节通过二分查找的例子展示本书学习新算法的基本方法,研究新算法的原理.用例.必要性(模拟实际情况)和性能. 重点: 1.二分查找: import java.util.Arrays; public class BinarySearch { public static int rank(int key, int[] a) { int lo = 0; int hi = a.length - 1; while (lo <= hi) { // 被查找的键要么不存在,要么必然存在于a[lo..hi]

二分查找 : 那个隐藏了 10 年的 Java Bug

一个偶然的机会,我想起以前还在谷歌上班的时候,有时候大家会在饭桌上讨论最新想出来的一些面试题.在众多有趣又有难度的题目中,有一道老题却是大家都纷纷选择避开的,那就是去实现二分查找. 因为它很好写,却很难写对.可以想象问了这道题后,在5分钟之内面试的同学会相当自信的将那一小段代码交给我们,剩下的就是考验面试官能否在更短的时间内看出这段代码的bug了. 二分查找是什么呢,这个不只程序员,其他很多非技术人员也会.比如我想一个1到100以内的数,你来猜,我告诉你每次猜的是大了还是小了,你会先猜50,然后

PAT甲级1010踩坑记录(二分查找)——10测试点未过待更新

题目分析: 首先这题有很多的坑点,我在写完之后依旧还有第10个测试点没有通过,而且代码写的不优美比较冗长勿喷,本篇博客用于记录写这道题的一些注意点 1.关于两个不同进制的数比大小一般采用将两个数都转化为10进制之后比较大小(下面统称已知进制数为N1,未知进制数为N2) 2.虽然两个数都只有10位,且每一位上的数字是从‘0’~‘z’,分别代表0~35,但是这并不意味值这题的进制范围就是2~36,radix完全有可能很大很大到long long,写‘0’~‘z’只是为了让结果计算出来相对小一些,并且

【技术宅10】顺序二分查找算法

//顺序查找 //顺序查找是在一个已知无序队列中找出与给定关键字相同的数的具体位置.原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止. function search($array,$k){ $n = count($array);             //count函数用于计算数组中的元素个数 $array[$n] = $k;                //新建一个元素,并将k存放进去 for($i=0; $i<$n; $i++){ if($array[$

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某

java二分查找举例讨论

最近做笔试题有这么一个关于二分查找的例子,有些疑惑. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3:找10.则返回-4(-1-3) 实现如下: public class Sulution1 { public static void main(String[] args) { System.out.println(findBySep(2, new int[]{0,2,4,6,9}));

Search in Rotated Sorted Array, 查找反转有序序列。利用二分查找的思想。反转序列。

问题描述:一个有序序列经过反转,得到一个新的序列,查找新序列的某个元素.12345->45123. 算法思想:利用二分查找的思想,都是把要找的目标元素限制在一个小范围的有序序列中.这个题和二分查找的区别是,序列经过mid拆分后,是一个非连续的序列.特别要注意target的上下限问题.因为是非连续,所以要考虑上下限,而二分查找,序列式连续的,只用考虑单限.有递归算法和迭代算法. 递归算法: 1 public int search(int[] nums, int target) 2 { 3 retu