二分法查詢(遞迴實現)

別攔著我,我要學習發表於2020-11-19

二分查詢

給定一個有序陣列,在陣列中查詢是否存在給定的一個整數,如果存在則返回陣列中全部等於該數的數的索引。

思路:

將陣列從某個位置一分為2,判斷是否大於該位置的數。若等於,則建立一個集合,將該位置的索引放入集合,並向左搜尋,若相等,繼續將索引放入集合,直到發現一個數小於該數,則停止;之後繼續向右搜尋,,繼續將索引放入集合,直到發現一個數大於該數,則停止,並返回集合。如果發現如果大於,則重複之前的步驟,將後半部分繼續按某個位置分為兩部分,若小於,也繼續重複上面的步驟。最終返回的集合中的元素就是我們想要的一個數在一個一個陣列中的索引。如果不存在,則返回一個空的陣列。

程式碼如下:

public static ArrayList< Integer > binarySearch(int[] arr, int value, int left, int right) {
        if (left > right) {
            return new ArrayList<Integer>();
        }

        int mid = (left + right) / 2;
        //像左遞迴
        if (arr[mid] > value) {
            return binarySearch(arr, value, 0, mid - 1);
        }
        //向右遞迴
        else if (arr[mid] < value) {
            return binarySearch(arr, value, mid + 1, right);
        }
        //找到了相同的值之後
        else {
            ArrayList< Integer > list = new ArrayList();
            list.add(mid);
            int m = mid;
            int n = mid;
            //向左繼續查詢
            while (n > left && arr[n - 1] == value) {
                list.add(n - 1);
                n--;
            }
            //向右繼續查詢
            while (m < right && arr[m + 1] == value) {
                list.add(m + 1);
                m++;
            }
            return list;
        }
}

相關文章