二分查找(解決數據重復值問題)


1、二分查找介紹

  二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結構,而且表中元素按關鍵字有序排列、

2、查找過程

  首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、

  后兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。

3、實現代碼

import java.util.ArrayList;
import java.util.List;
/**
 * 我們在進行二分查找查找數據的時候,如果有兩個重復值,就會出現找到了第二個值的下標
 * 並不能將兩個相同元素的下標都找出來。
 */
public class Test03_二分查找的改進算法 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 5, 6, 6,6, 6, 7, 8, 9};
        List<Integer> index = binarySearch(arr, 6);
        boolean empty = index.isEmpty();
        System.out.println(empty ? "不好意思,沒有找到要進行檢索的元素" : "您找到的元素下標為:" + index + "");
    }

    /**
     * 改進后的二分查找
     */
    public static List<Integer> binarySearch(int[] arr, int val) {
        List<Integer> indexList = new ArrayList<>();//用於接收返回的元素下標

        //數組的開始以及結束下標
        int begin = 0;
        int end = arr.length - 1;
        while (begin < end) {
            int mid = (begin + end) / 2;
            if (arr[mid] < val)
                begin = mid + 1;
            else if (arr[mid] > val)
                end = mid - 1;
            else {    //表示arr[mid] == val
                /*思路分析
                1.在找到mid索引值,不要馬上返回
                2.向mid索引值的左邊掃描,將所有滿足1000,的元素的下標, 加入到集合ArrayList
                3.向mid索引值的右邊掃描,將所有滿足1000, 的元素的下標,加入到集合ArrayList
                4.將ArrayList返回*/

                //向mid左邊掃描
                int temp = mid - 1;
                while (true) {
                    if (temp < 0 || arr[temp] != val)//沒有找到就退出循環
                        break;
                    //執行到這里說明找到了,就把找到的元素添加到集合中,繼續向左找
                    indexList.add(temp);
                    temp -= 1;
                }
                indexList.add(mid);//加入已經找到了的元素【arr[mid]==val】
                //向mid右邊掃描
                temp = mid + 1;
                while (true) {
                    if (temp > arr.length - 1 || arr[temp] != val)
                        break;
                    //執行到這里說明找到了,就把找到的元素添加到集合中,繼續向右
                    indexList.add(temp);
                    temp += 1;
                }
                return indexList;
            }
        }
        return indexList;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM