之前說過,二分法算法是一種非常常見的算法。這里大概說說算法的內容。具體算法如果有興趣,去百度、維基百科,搜搜就都能找到。我就不做搬運工了。這里就我個人的理解,不嚴謹的說說。
在排序好的一列大小為n的數組A[],找數字num。設left=0,right=n-1:
while(left<=right){
mid = (left + right)/2;
if (A[mid] == num) return mid;
if (A[mid] < num) left = mid + 1;
if (A[mid] > num) right = mid - 1;
}
return -1;
這里面 mid是我們找的中間點。如果正好找到了,那就直接返回不用繼續找了。如果num比中間點的數大,那左邊就移動到中間點的右邊。這樣搜索的范圍就小了一半。反之,則把右邊移到中間點的左邊。
最終如果已經搜素過了整個范圍,left已經大于right,我們還沒有找到num,那就是這個數組里沒有這個數。這里我用一個數組里并不存在的index,-1,來表示。
這個看起來簡單,但在實際的實現中,還有很多要注意的地方,這個以后有機會再說。
總之,上面已經給出了了最基本的二分法搜索算法:通過每次重新界定左右邊界來縮小一半的搜索范圍。