1. 程式人生 > >java二分查詢,折半查詢演算法

java二分查詢,折半查詢演算法

二分查詢是一個較為簡單的查詢演算法.要求所查資料集合必須為有序的.也因此,註定了這種資料結構在插入方面的xing效能很差(因為要移動引用位置,騰出空間來,在javali裡面,由於資料存的是引用.所以影響不大);

具體思路是: 在一個有序集合中,確定中間位置的值middleIndex位置.然後這個位置的值和要查詢的目標target進行比較, 如果小於target,說明middleIndex位置左邊的數都小於target.那麼將開始位置的下標設定為middleIndex. 即startIndex=middleIndex; 然後再來根據新的startIndex和endIndex算出一個新的middleIndex值. 如果target小於middleIndex位置的值.說明middleIndex右邊的數都是大於target的.那麼將endIndex設定為middleIndex. 重複上面的操作, 直到2者相等或者startIndex=endIndex...  

然後補充下上面邏輯會漏掉的情況,就是集合裡面只有一個數的情況. 這種情況下單獨抽離出來;

-------------------------------------------------

上面那種查詢針對的是集合裡面不會有重複資料的情況. 如果有重複資料, 那麼在第一次找到target的時候, 後面繼續用二分查詢很不划算(因為在有序集合中,相同的數一定是相鄰的), 所以這種情況下, 只需將middleIndex -1 或者middleIndex + 1就可以了;同時,這種方法還不會重複查詢已經找到過的資料.

public void binarySearch() {
//        int[] a = new int[] {1,2,3,7,7,7,7,8,9};
        int[] a = new int[]{7,7,7,7,7,7,7,7,7,7};
        int target = 7;
        int startIndex = 0;
        int endIndex = a.length - 1;
        int middleIndex = (startIndex + endIndex) / 2;
        /** 重複值查詢邏輯*/
        int lowIndex = 0;
        int upperIndex = 0;
        while (startIndex < endIndex && startIndex < middleIndex) {
            if (target > a[middleIndex]) {
                startIndex = middleIndex;
                middleIndex = (startIndex + endIndex) / 2;
            } else if (target < a[middleIndex]) {
                endIndex = middleIndex;
                middleIndex = (startIndex + endIndex) / 2;
            } else {
                System.out.println(middleIndex);
                /** 有重複值查詢邏輯*/
                lowIndex = middleIndex;
                upperIndex = middleIndex;
                while (startIndex <= middleIndex - 1) {
                    middleIndex = middleIndex - 1;
                    if (target == a[middleIndex]) {
                        System.out.println(middleIndex);
                    }
                }
                middleIndex = upperIndex;
                while (endIndex >= middleIndex + 1) {
                    middleIndex = middleIndex + 1;
                    if (target == a[middleIndex]) {
                        System.out.println(middleIndex);
                    }
                }
                return;
            }
        }
        /** 只有一個數的情況*/
        if (target == a[middleIndex]) {
            System.out.println(middleIndex);
        }
    }