博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
改写二分搜索算法及对于问题的理解
阅读量:5222 次
发布时间:2019-06-14

本文共 1416 字,大约阅读时间需要 4 分钟。

1、实践题目:

 改写二分搜索算法

 2、问题描述:

 设数组a[0:n-1]已排好序,输入一个整数x

 ①当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j

 ②当x在数组中时,ij相同,均是x在数组中的位置。

 输入:第一行是n值和x值,第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。

 输出:小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,ij相同。

 提示:x小于全部数值,则输出:-1 , x大于全部数值,则输出:n-1的值,n的值

3、算法描述:

 1)定义两个函数,主函数main()和二分搜索算法函数BinarySearch()。在函数BinarySearch()中,定义关键字key表示要查找的值x,定义一个长度为n的数组a[n]

 2)利用二分搜索的思想,在数组中查找关键字key。当left<=right,如果key==a[mid],则表示x在数组中,返回下标ij,如果key>a[mid],则left=mid+1,如果key<a[mid],则 right=mid-1,不断减半、循环,缩小范围查找,直到left>right,如果还是没有找到x,则把right赋值给ileft赋值给就j,然后返回下标ij

 3)返回小于x的最大元素位置i和大于x的最小元素位置j

4、算法部分代码:

1 int BinarySearch(int a[], int key, int n) { 2     int left = 0, right = n - 1; 3     int i = 0, j = 0; 4     while (left <= right) { 5         int mid = (left + right) / 2; 6         if (key == a[mid]) 7         { 8             i = j = mid; 9             cout << i <<" "<
<
a[mid]) left = mid + 1;13 else { right = mid - 1; }14 }15 i = right;16 j = left;17 cout << i<<" "<< j<

5、算法时间复杂度和空间复杂度:

 ①时间复杂度:循环体每循环一次时间复杂度减少一半,而且判断的时间复杂度为O(1),所以根据公式得算法时间复杂度为T(n)=1*T(N/2)+O(1)=O(logn)

 ②空间复杂度:各个变量的空间复杂度都是O(1),申请了n个空间,所以算法空间复杂度为O(n)

 6、心得体会:

 经过这次小组上机实践,我对于二分搜索算法有了更深刻的了解。在一开始,我和队友直接采用非二分法的方法,导致时间复杂度不符合要求,后来经过老师提醒和队友间的合作,最终完成了任务。二分搜索在while循环体内,每次将查找的范围缩小一半,循环、判断、减半,直到最后找到记录或者找不到记录时返回。该算法简洁明了,以后会多学习和练习类似的算法。

 

转载于:https://www.cnblogs.com/CYUCHUN/p/9820011.html

你可能感兴趣的文章
北京充电桩数据的获取与展示
查看>>
解决上传图片到服务器 水印文字显示框框不显示文字的问题
查看>>
读书笔记——乔布斯,做最好的自己,共创式教练
查看>>
ubuontu16.04安装Opencv库引发的find_package()错误信息处理及其简单使用
查看>>
用Linux远程挂载Windows上的共享文件夹.md
查看>>
洛谷 P4317 花神的数论题(组合数)
查看>>
【Python】学习笔记5-利用flask来mock接口
查看>>
jquery ui autocomplete
查看>>
冲刺一
查看>>
Linux禁用root账户登录
查看>>
day28 面向对象:反射,内置函数,类的内置方法
查看>>
【转】Mac OS X 快捷键合集
查看>>
对我影响最大的三位老师
查看>>
vue
查看>>
MySQL存储过程和存储函数
查看>>
【bzoj 2208】[Jsoi2010]连通数(dfs||Tarjan算法+拓扑序+dp)
查看>>
iis 隐藏 banner
查看>>
leetcode[18]4Sum
查看>>
Java ThreadLocal的使用
查看>>
为什么数据库ID不能作为URL中的标识符
查看>>