最近看一些算法題發現這些問題到最后落實到實現上都是編程基礎的體現,包括對基本的for,if,else,while等語句的理解程度,還有對循環遞歸的理解。所以還是得回歸最基本的算法,現在去學習那些高深復雜的DP,KMP,紅黑樹未免有點好高騖遠。目前應該堅持基礎,打好基礎,畢竟不是CS科班出身。言歸正傳,二分查找就是一個最基礎的算法。它的時間復雜度O(logn)。分為迭代實現和遞歸實現兩種,如下:程序沒有經過很多測試,應該有bug,歡迎指正。
int BinarySearch(int * a, int beg, int end, int elem) { if(beg <= end) { int mid = (beg + end ) / 2; if(a[mid] == elem) { return mid; } else if(a[mid] > elem) { end = mid-1; } else { beg = mid+1; } return BinarySearch(a, beg, end, elem); } else { return -1; } } int BinarySearchRecursive(int *a, int length, int elem) { if(a == NULL || length <=0) { return -1; } return BinarySearch(a, 0, length-1, elem); } int BinarySearchIterator(int *a, int length, int elem) { if(a == NULL || length <=0) { return -1; } int beg = 0; int end = length-1; int mid = 0; while(beg <= end) { mid = (beg + end) / 2; if(a[mid] == elem) { return mid; } else if(a[mid] > elem) { beg = mid + 1; } else { end = mid - 1; } } return -1; }
這里主要注意二分查找時,兩個下標的變化,以及最終結束查找的判斷條件是beg>end(查找失敗),或者(a[mid]==end)。時間有限,代碼質量一般,輕噴。