好好写一遍“用二分法在数列中搜寻一个数字”的代码

来源:互联网 发布: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的时候是否是重复算了几步。。。(其实是几天前写的,可能是网络的原因,没有提交上)