重溫二分查詢演算法(r4筆記第66天)
阿新 • • 發佈:2022-05-04
二分查詢在學習演算法的時候會涉及到,算是一個基本的分治思想,對於演算法的實現大家也都是很熟悉的,但是這個時候真會犯眼高手低的毛病。不信你自己試試,看你能夠在段時間內寫出可執行的二分查詢演算法。 二分查詢演算法的思想非常易於理解,但是能夠寫出一個準確的二分查詢程式絕非一個很簡單的事情,從歷史上來看,而非思想早在1946年就出現了,但是第一個完全正確的二分查詢演算法確實在1962年出現,計算機專家曾說過,90%以上的計算機專家不能再2個小時內寫出完全正確的二分查詢演算法。我反正是應了這句話,不過我不是計算機專家。 我們來看一個比較標準的二分查詢演算法
package new_test; public class BinarySearch { int arr[]; public static void main(String args[]){ test(); } public int binarySearch(int t,int[] arr){ int left=0; int right=arr.length; int middle; while(left<=right){ middle=(left+right)/2; if(t==arr[middle]){ return middle; } if(t>arr[middle]){ left=middle+1; } if(t<arr[middle]){ right=middle-1; } } return -1; } public static void test(){ int[] arr=new int[]{1,2,5,7,8,10,11,15,19,20}; System.out.println( new BinarySearch().binarySearch(8, arr)); } }
執行結果是4,即arr[4]=8 其實這個演算法還有一些值得思考的細節。比如求得兩個數之和的平均數 如果直接寫為middle=(left+right)/2就很可能出現數值溢位的情況。 可以使用下面的形式來避免,演算法博大精深,細節決定成敗。 middle=left+(right-left)/2;