二分查詢的越界和死迴圈問題

2021-08-08 01:27:40 字數 737 閱讀 6198

個人看來,二分查詢有兩個易錯點,那就是「越界」和「死迴圈」。這裡拿左閉右閉和左閉右開來說,

(1)左閉右開:

int binarysearch(seqlist* s, datatype x)

else if (s->array[mid]>x)

else

}這裡int left = 0, right = s->size ;   while (left < right)  這倆句可以看出是左閉右開"[ )"的情況,如果 if (s->array[mid]>x)滿足,那麼x在[left,mid)中,right此時應該設定為mid,如果按照上面**中的right = mid - 1;就有可能丟失mid對應的那個值,也就是array[mid]=x,這個值被忽略了,就有可能一直找不到x了。

(2)左閉右閉:

int binarysearch(seqlist* s, datatype x)

else if (s->array[mid]>x)

else}

這個就是對的。

(3)死迴圈:

int binarysearch(seqlist* s, datatype x)

else if (s->array[mid]>x)

else

}左閉右閉如果像上面一樣滿足 if (s->array[mid]>x),那麼x在[left,mid-1]中,right此時應該設定為mid-1,如果這裡mid不減1,就有可能在錯誤的區間死迴圈,一直找不到不能終止程式。

二分法查詢的死迴圈問題

二分法是一種查詢方法,它可以將查詢的時間複雜度由n降為log n 但我們在寫二分法的時候有時會出現死迴圈的問題,出現死迴圈基本上都是 left,right 範圍內只剩下兩個元素時出現的 right left 1 為了預防死迴圈的出現,不如試試下面這種寫法,當 left,right 區間內只剩下兩個元...

SDUT 二分查詢 迴圈

time limit 600 ms memory limit 65536 kib submit statistic problem description 給出含有n個數的公升序序列,保證序列中的數兩兩不相等,這n個數編號從1 到n。然後給出q次詢問,每次詢問給出乙個數x,若x存在於此序列中,則輸出...

迴圈控制 二分查詢

二分查詢思路 1 規定要查詢的值k可能在陣列arr內下標區間a,b 2 計算區間a,b的中間點m 3 若k4 若k arr m 將區間縮小為m,b,繼續二分查詢 5 若k arr m 則找到元素位於位置m 難點 邊界控制 要注意的點 關於區間的選法 半開半閉區間方便進行操作 比如說 a,b b,c ...