算法分析与设计实验报告

——二分搜索程序算法的实现

实验目的及要求

1.理解分治算法的概念和基本要素;
2.理解递归的概念;
3.掌握设计有效算法的分治策略;
4.通过二分搜索技术学习分治策略设计技巧;

实验环境

操作系统:Windows 10 操作系统
开发工具:Eclipse(4.15.0)
开发语言:Java

实验内容

1.使用二分搜索算法查找有序数列中的指定元素;
2.通过上机实验进行算法实现;
3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。

算法描述及实验步骤


实验步骤:

  1. 编写二分搜索算法;
  2. 将输入的数组元素排序,转化成有序列;
  3. 编写输入输出;
  4. 测试结果。

调试过程及实验结果

问题1:编写递归方法时返回的边界错误,导致陷入死循环。如
return RecursionBinarySearch(arr,key,left,middle);//搜索左半区
return RecursionBinarySearch(arr,key,middle,right);//搜索右半区

正确修改:return RecursionBinarySearch(arr,key,left,middle-1);
return RecursionBinarySearch(arr,key,middle+1,right);

问题2:编写迭代方法时while()的条件写成while(left<right)遗漏等号,导致搜索值key=arr[arr.length]时,输出“未搜索到key”。
正确修改:while(left<=right)
输出结果为:

总结

元素存储在数组中,因此搜索输出的结果为有序数组元素的下标。
若有序列中存在重复元素,搜索结果输出第一个元素的下标。
对二分搜索算法的边界问题要考虑清楚, 循环体外的初始条件与循环体内的步骤一定要遵守一致的区间规则(左右开闭),否则会发生陷入死循环、无法找到搜索元素的错误。
二分搜索算法是将数列按有序化排列,查找过程中采用跳跃式方式查找,先以有序数列的中点位置为比较对象,如果查找的元素值小于中点元素(key<middle),则将待查序列缩小为左半区间,否则为右半区间,直到找到相同元素,或者查找范围为空。
二分搜索算法的优点是比较次数少,查找速度快,平均性能好;缺点是要求待查表为有序表,且插入删除困难。

源代码

import java.util.Scanner;
public class BinarySearch{  public static int RecursionBinarySearch(int[] arr , int key , int left , int right){    //递归if((key<arr[left]||(key>arr[right])||(right>right)))return -1;int middle =(left &right) + ((left ^ right) >> 1); //防溢出(left &right) + ((left ^ right) >> 1);if(key<arr[middle]){return RecursionBinarySearch(arr,key,left,middle-1);//搜索左半区}else if(key>arr[middle]) {return RecursionBinarySearch(arr,key,middle+1,right);//搜索右半区}else{return middle;}}public static int CommonBinarySearch(int[] arr,int key) {    //迭代int left = 0;int right = arr.length-1;int middle = 0;if((key<arr[left])||(key>arr[right]))return -1;while(left<=right)  {middle =(left &right) + ((left ^ right) >> 1);if(key==arr[middle])return middle;else if(key<arr[middle])right = middle-1;//左半区搜索else if(key>arr[middle])left = middle+1;//右半区搜索}return -1;//未搜索到目标key返回-1}public static int[] Selectionsort(int[] arr) {//选择排序for(int i=0;i<arr.length-1;i++){int min = i;for(int j=i+1;j<arr.length;j++){if(arr[j]<arr[min])min = j;}if(i!=min) {int temp=arr[i];arr[i]=arr[min];arr[min]=temp;}}return arr;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入元素个数:");int n = sc.nextInt();int position;int[] arr = new int[n];//输入数组元素for(int i=0;i<n;i++){System.out.print(i+"号元素为:");arr[i] = sc.nextInt();}Selectionsort(arr);//选择排序数组元素System.out.println("选择排序(升序)后有序列为:");for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}System.out.println("");do {System.out.println("输入查找元素key:");int key =sc.nextInt();//递归搜索position = RecursionBinarySearch(arr,key,0,arr.length-1);if(position==-1){System.out.println("查找"+key+",有序列中不存在");}else{System.out.println("查找"+key+"(递归)\n"+"在有序列中的位置为:"+position);}//迭代搜索position = CommonBinarySearch(arr,key);if(position==-1){System.out.println("查找"+key+",有序列中不存在");}else{System.out.println("查找"+key+"(迭代)\n"+"在有序列中的位置为:"+position);}}while(true);}}

算法分析与设计实验报告 ——二分搜索程序算法的实现相关推荐

  1. 算法分析与设计实验报告——二分搜索算法的实现

    算法分析与设计实验报告--二分搜索算法的实现 目录: 算法分析与设计实验报告--二分搜索算法的实现 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与 ...

  2. 中北大学算法分析与设计实验报告一(BF算法)

    中北大学算法分析与设计实验报告一(BF算法) 1.实验名称 实验一 算法基础实验:数理基础与串匹配程序设计 2.实验目的 以字符串匹配问题为例,结合C等编程语言和链表.堆.栈等数据结构知识,基于BF算 ...

  3. 算法分析与设计实验报告——实现汽车加油问题

    算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...

  4. 算法分析与设计实验报告

    计算机算法分析与设计实验报告 实验一:递归回溯 阶乘(Factorial) #include<iostream> using namespace std; int factorial(in ...

  5. 中北大学算法分析与设计实验报告六(最大团问题)

    中北大学算法分析与设计实验报告六(最大团问题) 1.实验名称 实验六 回溯与分支限界算法实验 2.实验目的 题目:最大团问题 强化学生利用回溯算法和优化处理实际问题的能力. 3.训练知识点集群 (1) ...

  6. 算法分析与设计实验报告三——动态规划算法

    一.实验目的 掌握动态规划方法贪心算法思想 掌握最优子结构原理 了解动态规划一般问题 二.实验内容 编写一个简单的程序,解决0-1背包问题.设N=5,C=10,w={2,2,6,5,4},v={6,3 ...

  7. (MFC)广州大学大一下课程设计实验报告-学生成绩管理系统

    程序设计 课程设计实验报告 学院: 计算机科学与网络工程学院 专业班级: XXX 姓名: XXX 学号: 190XXXXXXX 指导老师:张艳玲 2020.6.29 目录 一.课程设计题目及内容 二. ...

  8. 计算机组成原理模型机设计实验总结,计算机组成原理课程设计实验报告-基本模型机设计与实现.docx...

    计算机组成原理课程设计实验报告-基本模型机设计与实现 计 算 机 组 成 原 理 实 验 报 告 评 语: 成绩 教 师: 年 月 日 班 级: 1403011 学 号: 140301124 姓 名: ...

  9. 计算机模型机设计实验报告,计算机组成原理课程设计实验报告-基本模型机设计与实现...

    计算机组成原理课程设计实验报告-基本模型机设计与实现 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 计 算 机 组 成 原 理实 ...

最新文章

  1. 深入理解文档/视图框架体系_九宫格项目开发感悟
  2. Matrix Power Series
  3. token和session的区别
  4. 知乎容器化构建系统设计和实践
  5. Plain text, flat file, 及flat-file database 如何翻译
  6. 什么是真正的程序员?
  7. 向左滚动,每次滚动的长度可以设置,然后暂停后继续滚动
  8. properties 配置回车_Dell?H730P?Raid1?配置方法
  9. 单片机can通信可以接多少个设备_总结BMS上CAN收发器电路的几个要点
  10. 平面设计中的网格系统pdf_哪些设计师必看平面设计书籍,写给设计师
  11. Tapestry5杂谈
  12. oracle 存储过程 实例 循环 给查询赋值 游标取值
  13. 机器学习算法的Python实现 (1):logistics回归 与 线性判别分析(LDA)
  14. Bitmap图片去除白色背景
  15. 软件构建中的设计(二)
  16. 08 量子力学教材推荐,量子力学书单:量子力学、高等量子力学、量子统计、量子信息、路径积分...(适合物理专业本科生、研究生、物理爱好者)
  17. 踩坑实录——多光谱影像(.tif)输入深度学习网络训练
  18. 嫁给我是你一生的赌注,我怎么舍得让你输
  19. Wired特写: 网络让她陷入「匿名虐待」的世界,这是一场关于数据和不信任的无休止暴力
  20. 读书有益——》谈谈简历和面试

热门文章

  1. 如何为新的微信公众号做引流矩阵的8个渠道
  2. 多线程批量获取腾讯云磁盘分区状态
  3. CAD网页Web端显示开发为什么要以WebGIS的思路来开发?
  4. net:ERR_UPLOAD_FILE_CHANGED in Chrome
  5. H5 实现横向滚动的方法及需要注意的地方
  6. 七牛上传图片初探 开始上传 暂停上传 继续上传
  7. Altium Designer绘制电路原理图——PCB图
  8. Hexo-Fluid主题添加音乐页面
  9. 按头安利 好看又实用的运动健身 体育海报模板素材看这里
  10. applecare多少钱?_AppleCare和AppleCare +有什么区别?