一個經典的二分查找算法
1: public static int binarySearch(int[] a, int key) { 2: int low = 0; 3: int high = a.length - 1; 4: 5: while (low <= high) { 6: int mid = (low + high) / 2; 7: int midVal = a[mid]; 8: 9: if (midVal < key) 10: low = mid + 1; 11: else if (midVal > key) 12: high = mid - 1; 13: else 14: return mid; // key found 15: } 16: return -(low + 1); // key not found. 17: }
很有意思,java.util.Arrays的BUG 。
bug出現在第6行:
6: int mid =(low + high) / 2;
在一般情況下, 這個語句是不會出錯的, 但是,當low+high的值超過了最大的正int值 (231 - 1) 的時候,mid會變成負值, 這個時候,會拋出ArrayIndexOutOfBoundsException 異常..
所以當一個數組包含超過2的30次方 個元素的時候, 就很可能會帶來問題...當然, 在一般的應用裏面, 很少數組會包含那麼多元素,但是現在這樣的情況已經越來越多了, 比如Google的海量運算..
那如何解決這個問題?
很簡單, 修改這行語句爲:
6: int mid = low + ((high - low) / 2);
或者
6: int mid = (low + high) >>> 1;