二分查詢演算法(Binary Search)的實現
阿新 • • 發佈:2019-02-01
用二分查詢在已排序的陣列中檢視該陣列是否含有一個特定的值是非常快速的,時間複雜度為O(lgn). 二分查詢思想很簡單,但是實現的時候會在邊界條件上出現一些意想不到的問題。 現貼出自己寫的程式,供大家參考。
第一個實現是基於迭代方式:
/// <summary> /// implement Binary Search algorithm through iteration approach. /// </summary> /// <param name="array">a sorted array</param> /// <param name="key">key value </param> /// <returns>the position of the key in the array. If this key is not found, return -1</returns> public int BinarySearchIteration(int[] array, int key) { int begin = 0; int end = array.Length - 1; while (begin <= end) { int mid = begin + (end - begin) / 2; if (array[mid] > key) { end = mid - 1; } else if (array[mid] < key) { begin = mid + 1; } else { return mid; } } return -1; }
下一個是基於遞迴方式實現:
/// <summary> /// implement Binary Search algorithm through recursion approach. /// </summary> /// <param name="array">a sorted array</param> /// <param name="begin">the search starting position</param> /// <param name="end">the search finishing position</param> /// <param name="key">the key value</param> /// <returns>the position of the key in the array. If this key is not found, return -1</returns> public int BinaraySearchRecursive(int[] array, int begin, int end, int key) { if (begin <= end) { int mid = begin + (end - begin) / 2; if (array[mid] > key) { return BinaraySearchRecursive(array, begin, mid - 1, key); } else if (array[mid] < key) { return BinaraySearchRecursive(array, mid + 1, end, key); } else { return mid; } } else { return -1; } }
這裡應該注意兩個地方:
一是對於mid 的值,應該用程式碼中的方式獲得,不能通過 mid = (begin + end) /2 來取得,因為 begin + end 的值會有可能大於 int 的最大值。
二是要注意在 if 判斷的時候用 <=, 沒有必要用 <, 然後再去做判斷,否則會多此一舉,而且也讓程式碼顯得很難看。
參考文獻: