好好写一遍“用二分法在数列中搜寻一个数字”的代码
来源:互联网 发布:mac安装windows程序 编辑:程序博客网 时间:2024/04/28 03:12
这个问题在《编程珠玑》的第四章中有讲到,据说作者在贝尔实验室里让一些人花了数小时来实现这个方法,但是最终只有10%的人的代码没有发现错误,因为总会有这样或者那样的疏漏。
然后我也试着在自己的电脑上写了一遍,是在记事本中写的,没有用到IDE,没有提示,不能试运行。写完之后检查检查,改了改小错误,然后放到vs里,不出所料又报了几个错误,下面是我改完之后的代码:
其中seekMore是后来加的,当时运行完以后又仔细想了想,有这样两点没有注意到,一个是我得到的数字所在的位置是在排序完以后的数列中的位置,而不是未排序的数列中的位置,还有一个问题就是,如果随机的数中对应要寻找的数不止一个,我也应该找出来,这个就是seekMore(int cursor, List<int> nList,int num)方法,但我总觉得这样写写的太差,最好可以把这个操作集成到seek方法中,如果有大侠知道怎么优雅的实现二分搜索,还请不吝赐教!
在写这篇文章的代码的时候,正好有人和我qq聊天,我说我在打代码。对方我说我虽然说毕业了学习还很认真,我当时调侃说我只是奋斗在中关村数十万码农中的一名三流的程序员而已,话虽如此,我相信,大部分人都不会满足于这样的现状的,不断学习,不断努力,加油吧!
后来想到的,总是不能给自己评论,只好通过编辑写在原文里了
今天把seek的代码改了以下,之前在seek()中包含排序方法我是觉得排序应该是属于二分搜索的一部分,现在为了重构方便把排序放在了外面,新的seek代码如下:
static int seek_2(int num, List<int> nList)
{
int min = 0;
int max = nList.Count - 1;
int mid;
while (min <= max)
{
mid = (min + max) / 2;
if (nList[mid] < num)
min = mid + 1;
else if (nList[mid] > num)
max = mid - 1;
else
return mid;
}
return -1;
}
这应该是简单的不能再简单的二分搜索实现了,不过我总觉得在运行到最后min = max-1的时候是否是重复算了几步。。。(其实是几天前写的,可能是网络的原因,没有提交上)
- 好好写一遍“用二分法在数列中搜寻一个数字”的代码
- 二分法查找已排序数列中目标数字的位置
- 统计一个数字在排序数组中出现的次数(二分法)
- 二分法求解数列中最小的数
- 在字符串中搜寻短字符串/字符的位置!
- 求一个数列的代码
- 用正则在eclipse中搜寻出所有中文字符
- 研究显示43%的Google搜寻是在地搜寻
- 只想在一个适合的环境,好好学编程!
- 只想在一个适合的环境,好好学编程!
- 二分法计算有序数组中数字出现的次数
- 如何在搜寻结果名中名列前茅
- 如何在搜寻结果名中名列前茅
- 二分法——【Search Insert Position】【Search for a Range】【数字在排序数组中出现的次数】
- 算法题8 在给定数列中查找和为给定值的两个数字
- 二分法在有序数组中查找一个数
- 在有序数列中插入数字并保持有序
- 二分法的代码实现
- 只为刷积分只为刷积分只为刷积分
- 什么是Processor affinity
- web开发中Post和Get的区别
- 第十三讲:不同类型数据间的转换
- Ubuntu10.10中安装VMware tools出现问题后如何解决
- 好好写一遍“用二分法在数列中搜寻一个数字”的代码
- 第十四讲:继承与派生的概念
- QT定时器操作
- 第十五讲:派生类的构造函数和析构函数
- SD2.0大会整理
- 头文件卫士的作用
- 12月笔记
- Swing:可选择关闭的 JTabbedPane(经过了一定的UI优化)
- 就这么一个例子,教你编译+运行+打包java文件