適用於各語言的二分查找算法,你get到了嘛?

目錄

二分查找算法定義

二分查找算法的過程剖析

二分查找算法的時間複雜度

二分查找的函數方法


Hello!大家好,我是努力賺錢買生髮水的灰小猿,最近在做開發的時候偶然用到了之前數據結構上的二分查找算法,所以在這裏和大家簡單的分享一下適用於各種語言的二分查找算法編寫。

那麼什麼叫二分查找算法呢?

 

二分查找算法定義

所謂二分查找算法,又叫折半查找,一般來說適用於數組元素,具體來說應該是已經按照順序存儲結構排列好的數組元素。它是一種效率較高的查找算法,通過對順序表進行折半查找,從而獲取到元素序列或查找次數的算法。

 

二分查找算法的過程剖析

我們假設現有的線性表中的元素是按照升序排列的,二分查找算法的思路就是將正在查找的表的中間元素和要查找的元素進行大小比較,若大小相等則輸出該元素所在位置或查找次數;

若該中間元素不等於被查找元素時,會將該線性表以中間元素分成前後兩部分的線性表,當中間元素小於被查找元素時,重新對後一部分的線性表進行二分查詢;

反之,若中間元素大於被查找元素時,對前一部分的線性表進行相同的二分查找,當中間元素等於被查找元素時,查找結束;或直到線性表無法再進行分割時,查找結束,這個時候則說明表中無該元素。

下面是二分查找算法的查找圖示:

 

二分查找算法的時間複雜度

二分查找的基本思想是:設有一個長度爲n個元素的升序排列的數組a,分成前後大致相等的兩部分,取中間元素a[n/2]與被查找元素(m)做比較,如果m=a[n/2],則找到m,算法中止;

如果m<a[n/2],則只要在數組a的左半部分繼續二分查找m,如果m>a[n/2],則在數組a的右半部繼續二分查找m.直到m=a[n/2]或數組不可再分割時查找結束。

 

因此時間複雜度就是while循環的次數,

總共有n個元素,

依次循環下去以後每次查找的元素個數就是:n、n/2、n/4、....n/2^k

若查找個數爲n時,也就是第一次查找就找到了元素,則循環次數爲1(也就是k=0的時候)所以循環次數爲(k+1)

由於n/2^k取整後爲(n/2^k)>=1

即令(n/2^k)=1

可得k=log2n,(是以2爲底,n的對數)

所以時間複雜度可以表示O(h)=O(log2n)。

 

二分查找的函數方法

以下爲進行二分查找的函數方法,

傳入的參數爲升序排列的數組和要查找的元素,若查找到該元素,則返回查找次數,否則返回-1。

static int binary_search(int[] a, int value)

        {

            int low = 0;

            int high = a.Length - 1;

            int count = 1;

            while (low <= high)

            {

                int middle = (low + high) / 2;

                if (a[middle] == value)

                {

                    return count;

                }

                if (value < a[middle])

                {

                    high = middle - 1;

                }

                else

                {

                    low = middle + 1;

                }

                count++;

            }

            return -1;

        }

二分查找的思維方法適用於任何需要進行順序表查找的語言,並且基本思路都是一樣的。上面的二分查找函數是基於C#的,小夥伴們還可以進行延伸。

 

覺得有用記得點贊關注喲!

同時有喜歡Python的小夥伴也可以關注我的微信公衆號“灰狼洞主”,回覆 “Python筆記”獲取Python從入門到精通筆記分享和常用函數方法速查手冊

大灰狼期待與你一同進步!

 

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