二分搜尋錯誤情況的分析

2021-06-18 07:07:06 字數 1765 閱讀 8399

又到了一年一季的招聘季,二分搜尋是乙個爛大街的題目,相信會寫的人不少,當你能真正知道錯誤寫法到底錯在**嗎?

錯誤一,因結束條件判斷錯誤,陣列中明明存在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則輸...