java算法之折半查找

折半查找又稱二分查找,優點:查詢次數比較少,查找速度快,平均性能好。缺點:要求待查表爲有序表,且插入困難,因此折半查找適用於不經常變動而查找頻繁的有序列表。
基本思想:將n個元素分成大致相等的兩部分,取a[n/2]與x做比較,如果x=a[n/2],則找到x,算法終止;
如果x< a[n/2],則只要在數組a的左半部分繼續搜索,如果x>a[n/2],則只要在數組a的右半部分搜素。
演示過程:設要查找的數爲36     num=36

假設數組爲:a[1,5,10,20,25,35,38]

step1:        int  low=0 high = a.length-1
注:
   low:數組中第一個元素的下角標
   high:數組中最後一個元素的下腳標
   mid:中間值

int mid = (low+high)/2 = (0+6)/2 = 3
a[mid] = a[3] = 20
因爲 num>a[mid]
所以 low=mid+1=4 high=6
step2: mid=(4+6)/2=5
a[mid] = a[5] = 35;
因爲: num>a[mid]
所以:low = mid+1 high=6
step3: mid = (low+high)/2=6
a[mid] = a[6] = 38
因爲:  num< a[mid]
所以:low=6 high = mid-1 = 5
因爲: low>high  
所以沒找到。

注:low必須小於等於high


折半查找算法如下:

  public static void main(String[] args){
        int[] a = {1,10,15,25,35,50};
        Scanner scanner= new Scanner(System.in);
        System.out.println("請輸入要查找的數:");
        int num = scanner.nextInt();
        //定義數組第一個元素下腳標
        int low =0;
        //最後一個元素的下角標
        int high = a.length-1;
        while (low<=high){
            int mid = (low+high)/2;
            if(num == a[mid]){
                System.out.println("找到了");
            }else if(num>a[mid]){
                low = mid+1;
            }else if(num<a[mid]){
                high = mid -1;
            }
        }
        if(low>high){
            System.out.println("數組中不存在此元素");
        }
    }
發佈了46 篇原創文章 · 獲贊 49 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章