二分搜索算法实验报告
- 格式:doc
- 大小:174.50 KB
- 文档页数:9
第1篇一、实验目的本次实验旨在通过数值实验,验证不同优化算法在解决特定优化问题时的性能和效率。
实验选取了三种常用的优化算法:黄金分割法、复合形法和进化场优化算法(EFO),分别针对一个典型的无约束优化问题进行实验,并对比分析其性能。
二、实验内容1. 黄金分割法- 基本原理:黄金分割法是一种基于搜索区间分割的优化算法,通过不断缩小搜索区间,寻找最优解。
- 实验设计:选择一个无约束优化问题,设定初始搜索区间,通过迭代计算,逐步缩小搜索区间,直至满足终止条件。
2. 复合形法- 基本原理:复合形法是一种基于几何形状的优化算法,通过迭代构建一个复合形,逐渐逼近最优解。
- 实验设计:选择与黄金分割法相同的优化问题,设定初始复合形,通过迭代调整复合形顶点,直至满足终止条件。
3. 进化场优化算法(EFO)- 基本原理:EFO是一种基于种群的元启发式优化算法,通过模拟自然进化过程,寻找最优解。
- 实验设计:选择与黄金分割法和复合形法相同的优化问题,设定初始种群,通过迭代计算,不断进化种群,直至满足终止条件。
三、实验步骤1. 选择优化问题- 实验选取了如下无约束优化问题:\[ f(x) = \sum_{i=1}^{n} x_i^2, \quad x \in [-5, 5]^n \]- 目标:求解函数 \( f(x) \) 的最小值。
2. 算法实现- 黄金分割法:编写程序实现黄金分割法的基本原理,设置初始搜索区间和终止条件。
- 复合形法:编写程序实现复合形法的基本原理,设置初始复合形和终止条件。
- EFO:编写程序实现EFO算法的基本原理,设置初始种群和终止条件。
3. 实验参数设置- 黄金分割法:设置迭代次数为100,初始搜索区间为 \([-5, 5]\)。
- 复合形法:设置迭代次数为100,初始复合形顶点为随机选取。
- EFO:设置迭代次数为100,初始种群规模为10。
4. 实验结果分析- 对比三种算法的迭代次数、最优解值和收敛速度。
一、实验目的本次实验旨在理解和掌握博弈树搜索算法的基本原理和应用,通过实际编程实现一个简单的井字棋游戏,并运用极大极小搜索和α-β剪枝算法优化搜索过程,提高算法效率。
二、实验原理1. 博弈树:博弈树是表示棋局所有可能变化的一种树状结构。
每一层代表棋局的一个状态,每个节点代表一个具体的棋盘布局。
从一个初始状态开始,通过一系列的走法,可以生成一棵完整的博弈树。
2. 极大极小搜索:极大极小搜索是一种基于博弈树的搜索算法,用于求解零和博弈问题。
在井字棋游戏中,一方为MAX(最大化自己的收益),另一方为MIN(最小化自己的收益)。
MAX的目的是争取获胜,而MIN的目的是避免失败。
3. α-β剪枝:α-β剪枝是一种剪枝技术,用于减少搜索树中需要搜索的节点数量。
在搜索过程中,如果发现当前节点的值小于α,则可以剪掉其右子树;如果发现当前节点的值大于β,则可以剪掉其左子树。
三、实验内容1. 游戏规则:井字棋的棋盘是一个3x3的格子,双方轮流在空格中放置自己的棋子(MAX用“O”,MIN用“X”)。
首先在横线、竖线或对角线上形成三个连续棋子的玩家获胜。
2. 编程实现:- 定义棋盘数据结构,包括棋盘大小、棋子状态等。
- 实现棋子的放置和移动功能。
- 实现检查胜负的功能。
- 实现极大极小搜索和α-β剪枝算法。
- 实现人机对战功能。
3. 算法优化:- 采用启发式搜索,根据当前棋盘状态评估双方的胜率。
- 优化搜索顺序,优先搜索对当前局势更有利的节点。
四、实验结果与分析1. 实验结果:通过实验,成功实现了井字棋游戏,并实现了人机对战功能。
在搜索过程中,α-β剪枝算法有效减少了搜索节点数量,提高了搜索效率。
2. 结果分析:- 极大极小搜索和α-β剪枝算法能够有效地解决井字棋问题,实现人机对战。
- 启发式搜索和搜索顺序优化能够进一步提高搜索效率。
- 博弈树搜索算法在解决类似问题(如五子棋、国际象棋等)中具有广泛的应用前景。
五、实验总结1. 收获:通过本次实验,掌握了博弈树搜索算法的基本原理和应用,学会了极大极小搜索和α-β剪枝算法,并成功地实现了井字棋游戏。
1. 掌握信息检索的基本原理和方法。
2. 熟悉常用的信息检索工具和系统。
3. 提高信息检索技能,提高信息获取效率。
二、实验环境1. 操作系统:Windows 102. 浏览器:Chrome3. 信息检索工具:百度、谷歌、必应等三、实验内容1. 实验一:信息检索原理与方法(1)了解信息检索的基本概念,如信息、知识、数据等。
(2)掌握信息检索的流程,包括信息收集、信息处理、信息检索、信息评估等。
(3)了解信息检索的基本方法,如布尔检索、短语检索、自然语言检索等。
(4)通过实验,学会使用信息检索工具进行信息检索。
2. 实验二:信息检索工具的使用(1)了解百度、谷歌、必应等搜索引擎的特点和优缺点。
(2)学会使用搜索引擎的高级搜索功能,如关键词搜索、按时间搜索、按网站搜索等。
(3)掌握使用学术搜索引擎,如CNKI、万方、维普等,获取学术资源。
(4)通过实验,学会使用信息检索工具获取所需信息。
3. 实验三:信息检索策略的制定(1)了解信息检索策略的概念和作用。
(2)掌握信息检索策略的制定方法,如关键词选择、检索式构造等。
(3)通过实验,学会制定有效的信息检索策略。
1. 实验一:信息检索原理与方法(1)阅读相关教材和资料,了解信息检索的基本原理和方法。
(2)在浏览器中输入关键词,观察搜索结果,了解搜索算法。
(3)分析搜索结果,总结信息检索的方法。
2. 实验二:信息检索工具的使用(1)在浏览器中输入关键词,使用百度、谷歌、必应等搜索引擎进行搜索。
(2)尝试使用搜索引擎的高级搜索功能,观察搜索结果的变化。
(3)使用学术搜索引擎,查找相关学术资源。
3. 实验三:信息检索策略的制定(1)根据实验要求,确定关键词。
(2)构造检索式,进行信息检索。
(3)分析检索结果,调整检索策略。
五、实验结果与分析1. 实验一:信息检索原理与方法通过实验,掌握了信息检索的基本原理和方法,了解了信息检索的流程。
同时,学会了使用信息检索工具进行信息检索。
数据结构实验指导书一、实验目的数据结构是计算机科学中的重要基础课程,通过实验,旨在帮助学生更好地理解和掌握数据结构的基本概念、原理和算法,提高学生的编程能力和问题解决能力。
具体而言,实验的目的包括:1、加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解,掌握其特点和操作方法。
2、培养学生运用数据结构解决实际问题的能力,提高算法设计和程序实现的能力。
3、增强学生的逻辑思维能力和调试程序的能力,培养学生的创新意识和团队合作精神。
二、实验环境1、操作系统:Windows 或 Linux 操作系统。
2、编程语言:C、C++、Java 等编程语言中的一种。
3、开发工具:如 Visual Studio、Eclipse、Code::Blocks 等集成开发环境(IDE)。
三、实验要求1、实验前,学生应认真预习实验内容,熟悉相关的数据结构和算法,编写好实验程序的代码框架。
2、实验过程中,学生应独立思考,认真调试程序,及时记录实验过程中出现的问题及解决方法。
3、实验完成后,学生应撰写实验报告,包括实验目的、实验内容、实验步骤、实验结果、问题分析与解决等。
四、实验内容(一)线性表1、顺序表的实现与操作实现顺序表的创建、插入、删除、查找等基本操作。
分析顺序表在不同操作下的时间复杂度。
2、链表的实现与操作实现单链表、双向链表的创建、插入、删除、查找等基本操作。
比较单链表和双向链表在操作上的优缺点。
(二)栈和队列1、栈的实现与应用实现顺序栈和链式栈。
利用栈解决表达式求值、括号匹配等问题。
2、队列的实现与应用实现顺序队列和链式队列。
利用队列解决排队问题、广度优先搜索等问题。
(三)树1、二叉树的实现与遍历实现二叉树的创建、插入、删除操作。
实现二叉树的前序、中序、后序遍历算法,并分析其时间复杂度。
2、二叉搜索树的实现与操作实现二叉搜索树的创建、插入、删除、查找操作。
分析二叉搜索树的性能。
(四)图1、图的存储结构实现邻接矩阵和邻接表两种图的存储结构。
算法与及数据结构实验报告算法与数据结构实验报告一、实验目的本次算法与数据结构实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见算法和数据结构的基本原理、特性和应用,提高我们解决实际问题的能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,为了进行算法性能的分析和比较,使用了 Python 的 time 模块来计算程序的运行时间。
三、实验内容1、线性表的实现与操作顺序表的实现:使用数组来实现顺序表,并实现了插入、删除、查找等基本操作。
链表的实现:通过创建节点类来实现链表,包括单向链表和双向链表,并完成了相应的操作。
2、栈和队列的应用栈的实现与应用:用数组或链表实现栈结构,解决了表达式求值、括号匹配等问题。
队列的实现与应用:实现了顺序队列和循环队列,用于模拟排队系统等场景。
3、树结构的探索二叉树的创建与遍历:实现了二叉树的先序、中序和后序遍历算法,并对其时间复杂度进行了分析。
二叉搜索树的操作:构建二叉搜索树,实现了插入、删除、查找等操作。
4、图的表示与遍历邻接矩阵和邻接表表示图:分别用邻接矩阵和邻接表来存储图的结构,并对两种表示方法的优缺点进行了比较。
图的深度优先遍历和广度优先遍历:实现了两种遍历算法,并应用于解决路径查找等问题。
5、排序算法的比较插入排序、冒泡排序、选择排序:实现了这三种简单排序算法,并对不同规模的数据进行排序,比较它们的性能。
快速排序、归并排序:深入理解并实现了这两种高效的排序算法,通过实验分析其在不同情况下的表现。
6、查找算法的实践顺序查找、二分查找:实现了这两种基本的查找算法,并比较它们在有序和无序数据中的查找效率。
四、实验步骤及结果分析1、线性表的实现与操作顺序表:在实现顺序表的插入操作时,如果插入位置在表的末尾或中间,需要移动后续元素以腾出空间。
删除操作同理,需要移动被删除元素后面的元素。
在查找操作中,通过遍历数组即可完成。
算法第⼆章实验报告⼀、实践题⽬maximum number in a unimodal arrayYou are a given a unimodal array of n distinct elements, meaning that its entries are in increasing order up until its maximum element, after which its elements are in decreasing order. Give an algorithm to compute the maximum element that runs in O(log n) time.⼆、问题描述给定的由n个不同元素组成的单峰数组,它的元素是递增的直到最⼤的元素,之后的元素是递减的。
给出计算运⾏时间为O(log n)的最⼤元素的算法。
三、算法描述1、定义⼀个int类型的binarysearch(int a[], int l, int r)函数,该函数⽤于进⾏⼆分查找,数组a[ ]存放输⼊数组,l和r分别为数组存放的最左边界下标和最右边界下标。
2、在binarysearch(int a[], int l, int r)函数中,定义了⼀个变量m,m表⽰(l+r)/2的中间数值的下标,这时我们可以判断,当(a[m]>a[m+1]&&a[m]>a[m-1]),m就是峰值,返回输出m。
当(a[m]>a[m+1]&&a[m]<a[m-1]),m⽐后⼀个⼤,⽐前⼀个⼩,说明峰值在m前半段,令r=m-1。
若不是前两种情况,则是峰值在m后半段,令l=m+1。
(同时要注意单峰数组可能有出界的情况)3、最后在main()函数,利⽤for循环输⼊数组,输出binarysearch(a, 0, n-1)。
四、算法时间复杂度以及空间复杂度的分析时间复杂度:本题binarysearch函数⽤来⼆分查找,时间复杂度要求O(log n)。
一、实验目的本次实验旨在通过仿真实验,验证某算法在实际应用中的性能和效果,并对算法的优化进行初步探讨。
通过实验,深入了解算法的原理,分析其优缺点,为实际工程应用提供参考。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 仿真软件:MATLAB 2019b4. 硬件环境:****************************,16GB RAM三、实验内容1. 算法原理及描述2. 仿真实验设计3. 实验结果分析4. 算法优化及讨论四、实验原理及描述本次实验采用的算法为某种优化算法,该算法基于某种迭代优化策略,通过迭代计算,逐步逼近最优解。
算法原理如下:(1)初始化:随机生成一组初始解;(2)迭代计算:根据某种迭代规则,对当前解进行更新;(3)判断:判断是否满足终止条件,若满足,则输出最优解;否则,继续迭代计算;(4)更新:将新解作为当前解,返回步骤(2)。
五、仿真实验设计1. 实验数据:选取一组具有代表性的测试数据,包括输入数据和期望输出数据;2. 实验步骤:(1)导入实验数据;(2)调用算法进行仿真实验;(3)记录实验结果;(4)分析实验结果。
六、实验结果分析1. 实验结果展示(1)输入数据:[1, 2, 3, 4, 5](2)期望输出:[1, 2, 3, 4, 5](3)算法输出:[1, 2, 3, 4, 5](4)误差分析:误差为0,说明算法输出与期望输出一致。
2. 性能分析(1)算法运行时间:0.001s(2)迭代次数:100次(3)算法收敛速度:较快3. 优缺点分析(1)优点:算法简单易实现,收敛速度快;(2)缺点:对初始解敏感,容易陷入局部最优。
七、算法优化及讨论1. 优化策略(1)改进初始解:采用某种方法生成更好的初始解,提高算法的鲁棒性;(2)调整迭代规则:优化迭代规则,使算法在迭代过程中更加稳定;(3)引入多种优化算法:结合多种优化算法,提高算法的适应性和全局搜索能力。
第1篇一、实验目的本次实验旨在通过实际操作,加深对算法设计方法、基本思想、基本步骤和基本方法的理解与掌握。
通过具体问题的解决,提高利用课堂所学知识解决实际问题的能力,并培养综合应用所学知识解决复杂问题的能力。
二、实验内容1. 实验一:排序算法分析- 实验内容:分析比较冒泡排序、选择排序、插入排序、快速排序、归并排序等基本排序算法的效率。
- 实验步骤:1. 编写各排序算法的C++实现。
2. 使用随机生成的不同规模的数据集进行测试。
3. 记录并比较各算法的运行时间。
4. 分析不同排序算法的时间复杂度和空间复杂度。
2. 实验二:背包问题- 实验内容:使用贪心算法、回溯法、分支限界法解决0-1背包问题。
- 实验步骤:1. 编写贪心算法、回溯法和分支限界法的C++实现。
2. 使用标准测试数据集进行测试。
3. 对比分析三种算法的执行时间和求解质量。
3. 实验三:矩阵链乘问题- 实验内容:使用动态规划算法解决矩阵链乘问题。
- 实验步骤:1. 编写动态规划算法的C++实现。
2. 使用不同规模的矩阵链乘实例进行测试。
3. 分析算法的时间复杂度和空间复杂度。
4. 实验四:旅行商问题- 实验内容:使用遗传算法解决旅行商问题。
- 实验步骤:1. 设计遗传算法的参数,如种群大小、交叉率、变异率等。
2. 编写遗传算法的C++实现。
3. 使用标准测试数据集进行测试。
4. 分析算法的收敛速度和求解质量。
三、实验结果与分析1. 排序算法分析- 通过实验,我们验证了快速排序在平均情况下具有最佳的性能,其时间复杂度为O(nlogn),优于其他排序算法。
- 冒泡排序、选择排序和插入排序在数据规模较大时效率较低,不适合实际应用。
2. 背包问题- 贪心算法虽然简单,但在某些情况下无法得到最优解。
- 回溯法能够找到最优解,但计算量较大,时间复杂度较高。
- 分支限界法结合了贪心算法和回溯法的特点,能够在保证解质量的同时,降低计算量。
3. 矩阵链乘问题- 动态规划算法能够有效解决矩阵链乘问题,时间复杂度为O(n^3),空间复杂度为O(n^2)。
引言概述推箱子是一种常见的游戏,也是计算机算法和研究中的经典问题,它涉及的算法和方法有助于提高问题解决能力和逻辑思维能力。
本文将对推箱子实验进行详细分析和讨论,包括推箱子游戏的定义、规则和目标,以及解决推箱子难题的算法和策略。
正文内容1.推箱子游戏的定义、规则和目标1.1定义:推箱子是一种益智类游戏,玩家需要将箱子推到指定位置,才能过关。
1.2规则:玩家通过控制一个游戏角色,推动箱子向指定位置移动,但箱子无法直接移动至目标位置。
1.3目标:玩家需要以最少的移动步数将所有箱子推至目标位置,即完成关卡。
2.解决推箱子难题的算法和策略2.1盲目搜索算法2.1.1深度优先搜索算法:从初始状态开始,一直沿着一个方向推动箱子,直到遇到障碍物为止。
2.1.2广度优先搜索算法:在每一步中,尝试所有可能的移动方向,并记录每个状态的移动路径,直到找到解决方案。
2.1.3双向搜索算法:从初始位置和目标位置同时开始搜索,直到两个搜索路径相交为止。
2.2启发式搜索算法2.2.1A算法:根据启发函数估计当前状态到目标状态的距离,选择距离最小的下一步移动方向。
2.2.2剪枝算法:通过预判某些状态的不可行性,提前排除无需尝试的移动方向。
2.2.3贪心算法:每次选择距离目标位置最近的箱子进行推动,以减少总体移动步数。
2.3知识表示与推理2.3.1逻辑推理:使用逻辑规则和推理算法进行箱子和角色的位置推理。
2.3.2状态空间搜索:将推箱子问题转化为状态空间搜索问题,通过搜索解空间来获得解法。
2.3.3约束满足问题:将箱子移动约束转化为约束满足问题,使用约束满足算法找到解决方案。
2.4强化学习方法2.4.1Q学习:使用状态动作奖励状态的马尔可夫决策过程进行学习和决策的强化学习方法。
2.4.2深度强化学习:基于深度神经网络的强化学习方法,通过大量样本数据进行模型训练和优化。
2.4.3遗传算法:通过基因编码和演化算子的操作,寻找最优的解决方案。
个人自我介绍简单大方
很抱歉,但我无法为您提供____字的自我介绍。
以下是一个简洁而大方的自我介绍示例,供您参考:
大家好,我叫[姓名]。
很高兴有机会向大家介绍一下自己。
我出生并长大在[所在地],是一个勤奋、积极向上的人。
在学业方面,我于[毕业时间]从[学校名称]获得了[学位/专业]学位。
在大学期间,我通过自我努力和课外学习,取得了良好的学术成绩,并参与了一些学生组织和社团活动。
这些经历不仅培养了我的团队合作和领导能力,也加强了我的沟通和组织能力。
在工作方面,我有[工作年限]年的相关工作经验。
我曾在[公司/组织名称]担任[职位],负责[工作职责]。
在这期间,我不断努力提升自己的专业知识和技能,以适应快速发展的工作环境。
我善于分析问题并找出解决方案,能够有效地与团队合作并承担责任,这些都为我赢得了同事和上级的认可。
除了工作,我也积极参与志愿者活动,希望能为社区和弱势群体做一点贡献。
我相信,通过奉献和关心他人,我们可以建立一个更加和谐和温暖的社会。
在个人生活中,我喜欢阅读、旅行和运动。
阅读扩展了我的视野,旅行让我能够体验不同的文化和风景,而运动则让我保持健康和积极的精神状态。
此外,我也很喜欢与家人和朋友相处,分享彼此的喜怒哀乐。
总的来说,我是一个热情、乐观、有责任心的人。
我相信勤奋和坚持可以取得成功,而真诚和善良可以赢得他人的信任和支持。
我希望能够在您的团队中发挥我的才能,并与大家一同成长和进步。
这就是我简单的自我介绍,谢谢大家!。
实验一 二分搜索算法实验报告 一. 实验目的 1、 理解分治算法的概念和基本要素; 2、 理解递归的概念; 3、 掌握设计有效算法的分治策略; 4、 通过二分搜索技术学习分治策略设计技巧; 二.实验内容及要求
1. 使用二分搜索算法查找任意N个有序数列中的指定元素。 2. 通过上机实验进行算法实现。 3. 保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4. 至少使用两种方法进行编程。 三.实验原理
二分搜索算法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。
【基本思想】将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。
方法一:直接查找 穷举法遍历 方法二:递归查找 #include #define MAX 30 int BinarySearch(int a[],int &x,int left,int right) { if(left>right){ return -1; } else{ left=(left+right)/2; if(x==a[left]) return left; else { if(x>a[left]) BinarySearch(a,x,left+1,right); else BinarySearch(a,x,left*2-right,left+1); } } } main() { int a[MAX]; int found,x,n,i,j,p; printf("输的个数\n"); scanf("%d",&n); printf("数组数据\n"); for(i=0;i{ scanf("%d",&a[i]); } for (i=0;i{ p=i; for (j=i+1;jif (a[p]>a[j]) p=j; if (p!=j) { x=a[p]; a[p]=a[i]; a[i]=x; } } for(i=0;i{ printf("%d ",a[i]); } printf("输入要查找的数\n"); scanf("%d",&x); found=BinarySearch(a,x,0,n); if(found==-1) { printf("未找到\n"); } else { printf("要查找的数在第 %d个\n",found+1); } }
方法三:迭代查找 #include #define MAX 30 int BinarySearch(int a[],int &x,int n) { int left =0; int right=n-1; int middle; while(left<=right){ middle=(left+right)/2; if(x==a[middle]) return middle; if(x>a[middle]) left=middle+1; else right=middle-1; } return-1; }
main() { int a[MAX]; int found,x,n,i,j,p; printf("数的个数\n"); scanf("%d",&n); printf("数组数据\n"); for(i=0;i{ scanf("%d",&a[i]); } for (i=0;i{ p=i; for (j=i+1;jif (a[p]>a[j]) p=j; if (p!=j) { x=a[p]; a[p]=a[i]; a[i]=x; } } for(i=0;i{ printf("%d ",a[i]); } printf("输入要查找的数\n"); scanf("%d",&x); found=BinarySearch(a,x,n); if(found==-1) { printf("未找到\n"); } else { printf("要查找的数在第 %d 个\n",found+1); } } 四.程序代码 变量定义说明: BinarySearch()算法: a->数组 key->要查找的元素 left->左标志 right->右标志 (n->数据个数) Main()主函数: ound->是否找到标志,-1表示未找到,找到其值为下标 x->要查找的元素 n->元素个数 i,j,p->循环控制变量
(1)、递归查找 #include #define MAX 30 int BinarySearch(int a[],int key,int left,int right) { int mid=(right-right)/2+left; if(a[mid]==key) { return mid; } if(left>=right) { return -1; }else if(key>a[mid]) { return BinarySearch(a,key,mid+1,right); } else if(keyreturn BinarySearch(a,key,left,mid- 1); } return -1; } int main(void) { int a[MAX]; int found,x,n,i,j,p; printf("数据个数:"); scanf("%d",&n); printf("输入数据:\n"); for(i=0;i{ printf("请输入第%d个数据:",i); scanf("%d",&a[i]); } for (i=0;i{ p=i; for(j=i+1;jif(a[p]>a[j]) p=j; if (p!=j) { x=a[p]; a[p]=a[i]; a[i]=x; } } printf("排序后的数据如下:"); for(i=0;i{ printf("%d ",a[i]); } printf("\n"); printf("输入要查找的数:"); scanf("%d",&x); int left=0,right=n; found=BinarySearch(a,x,left,right); if(found==-1) { printf("未找到\n"); } else { printf("要查找的数在第%d个\n",found+1); } }
(2)、非递归查找 #include #define MAX 30 int BinarySearch(int a[], int key,int len){ int mid=len/2; if (key==a[mid]) { return mid; } int left=0; int right=len-1; while(left<=right){ //迭代查找 mid=(right+left)/2; if(keyright=mid-1; }else if(key>a[mid]) { left=mid+1; }else{ return mid; } } return -1; } int main(void) { int a[MAX]; int found,x,n,i,j,p; printf("数据个数:"); scanf("%d",&n); printf("输入数据:\n"); for(i=0;i{ printf("请输入第%d个数据:",i); scanf("%d",&a[i]); } for (i=0;i{ p=i; for(j=i+1;jif(a[p]>a[j]) p=j; if (p!=j) { x=a[p]; a[p]=a[i]; a[i]=x; } } printf("排序后的数据如下:"); for(i=0;i{ printf("%d ",a[i]);