又到了一年一季的招聘季,二分搜尋是乙個爛大街的題目,相信會寫的人不少,當你能真正知道錯誤寫法到底錯在**嗎?
錯誤一,因結束條件判斷錯誤,陣列中明明存在key,但程式卻卻找不到
public static int binary_search(int array, int key, int begin, int end)
else
}return 0;
}
測試用的**:
int array = ;
int index = binarysearch.search(array, 4, 0, 9);
system.out.println("index = " + index);
執行的結果:
begin = 0 mid = 5 end = 10
begin = 0 mid = 2 end = 4
begin = 3 mid = 3 end = 4
index = 0
你會發現明明陣列中存在4,但卻沒有找到。原因就是判斷程式結束時使用了:左閉右開的區間:[0, n)。因此,當這個條件滿足時,end應該為mid (已判斷要搜尋的key不是mid), 而在這裡right賦值為middle - 1了, 判斷區間為:[0, middle-1),那麼就會遺漏array[middle - 1] = v的情況。
錯誤二,無限迴圈
public static int binary_search (int array, int key, int begin, int end)
if(array[mid]>key)
else
}return 0;
}
int array = ;
int index = binarysearch.search_1(array, 4, 0, 9);
執行的結果:
begin = 0 mid = 4 end = 9
begin = 0 mid = 2 end = 4
begin = 2 mid = 3 end = 4
begin = 3 mid = 3 end = 4
begin = 3 mid = 3 end = 4
begin = 3 mid = 3 end = 4
begin = 3 mid = 3 end = 4
無限迴圈
原因:因為while(begin<=end),而且:begin=mid或begin=end,所以當mid=begin而且找不到key的時候會死迴圈。
正確的寫法:
public static int binary_search(int array, int key, int begin, int end)
if(array[mid]>key)
else
}return 0;
}
int array = ;
int index = binarysearch.search(array, 5, 0, 10);
執行結果:
begin = 0 mid = 5 end = 10
begin = 0 mid = 2 end = 4
begin = 3 mid = 3 end = 4
begin = 4 mid = 4 end = 4
index = 4
二分查詢錯誤事例分析
include int search int array,int n,int v else if array middle v else return 1 在這裡,迴圈的開始處,把迴圈遍歷的序列區間是這樣的 left 0,right n while left right 迴圈體 也就是說,這是乙個左...
Java 二分搜尋 二分查詢
對陣列元素進行逐個查詢顯然是費時費力的工作,我們可以使用一些方法快速地搜尋出陣列中元素的指定位置.接下來我們介紹一種方法 二分搜尋法 二分搜尋法充分利用了元素間的次序關係.基本思想 將n元素分成個數大致相同的涼拌,取arr n 2 與欲查詢的x做比較,如果 下面將採用兩種方式 遞迴 非遞迴 來展示二...
二分入門 二分知識 及 幾種情況
二分排序 時間複雜度是 log n 最壞的情況下是 n 乙個條件是帶查詢陣列是有序的,分兩種 一公升序 而降序 主要思路就是指定兩個指標start end 分別指向陣列元素的兩端,然後比較陣列中間的arrat mid 和待查詢元素,n 直接找到某值在右若干個 n時 找n 以下是 若找到中間值是n則輸...