第一次盲寫二分查詢的打臉

2021-06-28 05:05:58 字數 1334 閱讀 5070

public static int dosearch(int arry, int target)

int low_index = 0;

int high_index = arry.length-1;

int mid_index;

while (low_index < high_index)

if (target < mid_val)

if (target == mid_val)

}return -1;

}

單元測試一測,乙個測試方法一直出不來,**運算量並不大,果斷有死迴圈。這也給自己提了個醒,測試方法應加上timeout。debug一下,發現死迴圈發生在測試下邊界值處。原來第一處打臉的地方是在 low_index = mid_index 。

原因分析一下是,當對low_index和high_index之間的區域折半時,得到的一半值mid_index永遠會偏向low_index,也就是:恰好有中間整數,得到的就是中間值;如果沒有中間整數值,則滑向最接近的低位整數。如果low_index和high_index剛好相差1,mid_index的計算結果一直等於low_index,迴圈陷在將mid_index的計算結果為low_index然後再賦給low_index中出不來。

因此,low_index = mid_index修改為low_index = mid_index + 1,同時high_index = mid_index - 1。這本身也是折半的原理所在:折半對比,目標大於半數值,從高於折半處擷取重新查詢(low_index = mid_index + 1);目標小於半數值,從低於折半處擷取重新查詢(high_index = mid_index - 1);總之不相等則丟棄折半處

當使用while (low_index < high_index),對於陣列長度為5或者6時,索引處1的值查詢不出來。原因在於最後一次折半前,高低位重合,跳出迴圈,而來不及計算mid_index。

最後的寫法,通過測試

public static int dosearch(int arry, int target)

int low_index = 0;

int high_index = arry.length-1;

int mid_index;

while (low_index < =high_index)

if (target < mid_val)

if (target == mid_val)

}return -1;

}

二分查詢,返回第一次出現的位置

題目描述 對於乙個有序陣列,我們通常採用二分查詢的方式來定位某一元素,請編寫二分查詢的演算法,在陣列中查詢指定元素。給定乙個整數陣列a及它的大小n,同時給定要查詢的元素val,請返回它在陣列中的位置 從0開始 若不存在該元素,返回 1。若該元素出現多次,請返回第一次出現的位置。測試樣例 1,3,5,...

我的第一次寫部落格

資料型別有整型 浮點型 字元型 1.整型有兩種區分一種按照有無符號另一種是按照所佔記憶體區分 有符號整型和無符號整型 整型 整數 singed 有符號整型 可以是正數也可以是負數例如可以是 5和 5 unsinged 無符號整型 只能是正數不能是負數例如 5 按照所佔記憶體區分 short短整型 占...

二分法查詢某個數第一次出現位置

對於乙個有序陣列,我們通常採用二分查詢的方式來定位某一元素,請編寫二分查詢的演算法,在陣列中查詢指定元素。給定乙個整數陣列a及它的大小n,同時給定要查詢的元素val,請返回它在陣列中的位置 從0開始 若不存在該元素,返回 1。若該元素出現多次,請返回第一次出現的位置。include include ...