好好寫一遍“用二分法在數列中搜尋一個數字”的代碼

這個問題在《編程珠璣》的第四章中有講到,據說作者在貝爾實驗室裏讓一些人花了數小時來實現這個方法,但是最終只有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的時候是否是重複算了幾步。。。(其實是幾天前寫的,可能是網絡的原因,沒有提交上)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章