首頁  >  文章  >  php教程  >  二分法查找介紹

二分法查找介紹

高洛峰
高洛峰原創
2016-12-19 16:29:391735瀏覽

二分法查找

今天講一下“二分法查找”,二分法查找思路就是在一段順序數組中,每次和某一段數組中間數比大小。二分法查找的缺點是數組必須是順序的(我以由小到大排序資料為例),優點是查詢效率極高,時間複雜度是log2n。這種查找方式越是在大數據下,效果越明顯。以下附上原始碼和單元測試,原始碼包含兩種演算法,一種是循環一種是遞歸,大家多參考:
原始碼:

       ///


       /// 利用二分法找出一個資料所在問題位置。 (遞歸方法)
       /// 陣列必須是從小到大排序的,如果是未排序資料可使用類別
       /////> cref="Sort"IntionSort="Sort"排序。
       /// 如果要尋找的值在陣列中不存在,則回傳-1。
       ///

       /// 陣列
       /// 想要的值  returns>回傳第幾個,若要尋找的數值在陣列中不存在,回傳-1
       public static int Search(int[] array, int value)
      {ullif{ h   throw new ArgumentException("array is null"); }
           if (array[array.Length - 1] == value) { return array.Length - 1; }
           return Search(array, 0, array.Length - 1, value);
       }
       private static int Search(int[] array, int beginIndex, int endIndex, int value)🠎  含x + endIndex) / 2;
           if (endIndex == beginIndex)
           { return array[beginIndex] == value ? beginIndex : -1; }
           else if (endIndex == beginIndex + 1) [beginIndex] == value) { return beginIndex; }
               else if (array[endIndex ] == value) { return beginIndex; }
               else { return -1; }
           }🠦.     { return middle; }
           else if (array[middle] > value)
           { return Search(array, beginIndex, middle, value); }
           else if (array[middle]        可能   return -1;
       }

       // /
       /// 使用二分法找出一個資料所在問題位置。 (循環方法)
       /// 陣列必須是從小到大排序的,如果是未排序資料可使用類別
       ///// 類型 cref="Sort"排序。
       /// 如果要尋找的值在陣列中不存在,則回傳-1。
       ///

       /// 陣列
       /// 想要的值  returns>傳回第幾個,要找出的值在陣列中不存在,回傳-1
       public static int Search2(int[] array, int value)
          int endIndex = array.Length - 1;
           while (true)
           {
            {
             {
                   if (value == array[beginIndex]) { return beginIndex endIndex]) { return endIndex; }
                   { return -1; }
          iddle endIndex) / 2;
               if (value                if (value == array[middle]) { return middle; }
               if (value > array[middle]) { beginIndex = middle; }
           }
       }

單元測試:
       [TestMethod()]
ode       public void SearchTest()
       {
           隨機 random = new Random();
         new int[100];
           for (int i = 0; i            {            
           }
         int[] array3 = BitmapSort.Sort( array2 );
           for (int i = 0; i            {
            {
  ), i);
             As sert.Are等於(BinarySearch.Search2 ( array3, array3[i]), i);
           }
           Assert.AreEqual(BinarySearch.Search(array3, 999), - reEqual(BinarySearch.Search2(array3, 9999), -1);
       }



更多二分法介紹文章查找相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn