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

函数接口定义:

Position BinarySearch( List L, ElementType X );

其中List结构定义如下:

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

L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递增有序的。函数BinarySearch要查找XData中的位置,即数组下标(注意:元素从下标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 L, ElementType X );int main()
{List L;ElementType X;Position P;L = ReadInput();scanf("%d", &X);P = BinarySearch( L, X );printf("%d\n", P);return 0;
}/* 你的代码将被嵌在这里 */

输入样例1:

5
12 31 55 89 101
31

输出样例1:

2

输入样例2:

3
26 78 233
31

输出样例2:

0

Position BinarySearch( List L, ElementType X )

{

int min = 1, max = L->Last;

while(min <= max)

{

int mid = (min + max) / 2;

if(mid > X)

{

max = mid - 1;

mid = (min + max) / 2;

}

else if( mid < X)

{

min = mid + 1;

mid = (min + max) / 2;

}

else

{

return mid

}

}

return NotFound;

}

二分查找主要是对线性表的初步了解,然后其中需要把min和max这两个参数在while里面的变化规律搞清楚,然后找到极端情况的出口,如没有找到的情况,因为查找无非两种情况,找到和找不到,这里把找不到转化为min和max的关系是关键。

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.

时间复杂度无非就是while循环的次数!

总共有n个元素,

渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数

由于你n/2^k取整后>=1

即令n/2^k=1

可得k=log2n,(是以2为底,n的对数)

所以时间复杂度可以表示O(h)=O(log2n)

习题1.8 二分查找 (20 分) 数据结构练习相关推荐

  1. 习题1.8 二分查找 (20 分)

    习题1.8 二分查找 (20 分) 本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如下 ...

  2. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  3. 习题2.1 简单计算器 (20 分)

    习题2.1 简单计算器 (20 分) 模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运 ...

  4. PTA习题7-1 选择法排序 (20 分)

    习题7-1 选择法排序 (20 分) 本题要求将给定的n个整数从大到小排序后输出. 输入格式: 在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格. 输入样例: 4 5 1 7 ...

  5. 【PTA题目解答】习题6-7 简单计算器 (20 分)模拟简单运算器的工作。

    习题6-7 简单计算器 (20 分)模拟简单运算器的工作. 习题6-7 简单计算器 (20 分)模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从 ...

  6. d - 数据结构实验之查找四:二分查找_【数据结构】资料

    春天来了,关注我们吧!! 数据结构资料 1.栈和队列的共同特点是( ). A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 答案:A 解析:栈的操作只允许在栈的一端 ...

  7. 习题3.4 最长连续递增子序列 (20 分) 数据结构 PTA

    给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8). 输入格式: 输入第1行给出正整数n ...

  8. 习题4-5 换硬币(20 分)

    将一笔零钱换成5分.2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法? 输入格式: 输入在一行中给出待换的零钱数额8. 输出格式: 要求按5分.2分和1分硬币的数量依次从大到小的顺序,输出各 ...

  9. 7-2 改写二分搜索算法 (20 分)

    题目来源:<计算机算法设计与分析>,王晓东 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数 ...

最新文章

  1. 《新一代城市大脑建设与发展》专家研讨会在京举办
  2. 【Android 逆向】Android 逆向通用工具开发 ( Android 逆向通用工具组成部分 | 各模块间的关联 )
  3. verilog 基础篇 signal_tap 的使用
  4. batchnorm2d参数 torch_Pytorch-nn.BatchNorm2d()
  5. sklearn自学指南(part32)--保序回归
  6. python数组合并、输入三行数据,如何在python中合并两个或三个3D数组?
  7. Datepicker-for-Bootstrap 日期选择插件
  8. 怎么关闭虚拟机服务器,ESXI | 命令行 | 强行关闭虚拟机进程 | 无法远程访问服务器...
  9. 如何把RAR文件改成ZIP格式
  10. Mysql中有关Datetime和Timestamp的使用总结
  11. 火焰数据集 烟雾数据集 整理 下载 传百度网盘
  12. 微纳自组装技术——纳米孔道阵列辅助自组装技术简述
  13. 一篇荡气回肠的统计思想漫谈——漫谈相关与回归
  14. android后台进程数目限制
  15. 财务会计 -- 什么是借贷
  16. 两国的“微”与“博”——Twitter与新浪微博的功能差异化探究
  17. Linux内核中的位操作:ffs.h,fls.h
  18. 中国大茴香行业利润及销量增长情况报告(新版)2021-2026年
  19. 马丁福勒《UML精粹》读书笔记_第六章
  20. jfinal 上传图片、文件

热门文章

  1. SpringBoot入门之简单配置
  2. [Object]面向对象编程(高程版)(二)原型模式
  3. JAVA自测题栏目正式上线,来测测你的Java功力到底如何!
  4. 面试时被问如何进行接口测试怎么回答
  5. java解决斐波那契数列(Fibonacci sequence)
  6. 谱比法计算岩石的品质因子的c语言程序,地层品质因子计算方法及系统与流程...
  7. python可以调试吗_python调试的几种方法
  8. rms | 如何绘制模型带置信区间的预测曲线
  9. 如何画心_字画如何装裱?仅需三步!
  10. c语言入门百度贴吧,c语言入门者