1. 程式人生 > 其它 >21.二分查詢演算法

21.二分查詢演算法

1.演算法

public static int binarySearch(int[] arr, int left, int right, int findVal) {
   

   // 當 left > right 時,說明遞迴整個陣列,但是沒有找到
   if (left > right) {
      return -1;
   }
   int mid = (left + right) / 2;
   int midVal = arr[mid];

   if (findVal > midVal) { // 向 右遞迴
      return binarySearch(arr, mid + 1, right, findVal);
   } else if (findVal < midVal) { // 向左遞迴
      return binarySearch(arr, left, mid - 1, findVal);
   } else {
      
      return mid;
   }

}

2.課後思考題: {1,8, 10, 89, 1000, 1000,1234} 當一個有序陣列中,有多個相同的數值時,如何將所有的數值都查詢到,比如這裡的 1000

public static List<Integer> binarySearch2(int[] arr, int left, int right, int findVal) {

      System.out.println("hello~");
      // 當 left > right 時,說明遞迴整個陣列,但是沒有找到
      if (left > right) {
         return new ArrayList<Integer>();
      }
      int mid = (left + right) / 2;
      int midVal = arr[mid];

      if (findVal > midVal) { // 向 右遞迴
         return binarySearch2(arr, mid + 1, right, findVal);
      } else if (findVal < midVal) { // 向左遞迴
         return binarySearch2(arr, left, mid - 1, findVal);
      } else {
//        * 思路分析
//        * 1. 在找到mid 索引值,不要馬上返回
//        * 2. 向mid 索引值的左邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList
//        * 3. 向mid 索引值的右邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList
//        * 4. 將Arraylist返回
         
         List<Integer> resIndexlist = new ArrayList<Integer>();
         //向mid 索引值的左邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList
         int temp = mid - 1;
         //退出
         while (temp >= 0 && arr[temp] == findVal) {
            //否則,就temp 放入到 resIndexlist
            resIndexlist.add(temp);
            temp -= 1; //temp左移
         }
         resIndexlist.add(mid);  //
         
         //向mid 索引值的右邊掃描,將所有滿足 1000, 的元素的下標,加入到集合ArrayList
         temp = mid + 1;
         //退出
         while (temp <= arr.length - 1 && arr[temp] == findVal) {
            //否則,就temp 放入到 resIndexlist
            resIndexlist.add(temp);
            temp += 1; //temp右移
         }
         
         return resIndexlist;
      }

   }