使用 Java 进行 DSA - 二分搜索



概览

二分搜索是一种非常快速的搜索算法。此搜索算法遵循分而治之的原理。为了正确执行此算法,数据收集应以排序形式。

二分搜索通过比较集合的中间项搜索特定项。如果匹配,则返回该项的索引。如果中间项大于项,则在中间项右边的子数组中搜索该项,否则在中间项左边的子数组中搜索该项。此过程也将继续进行子数组,直到子数组的大小减小到零。

二分搜索将可搜索项减半,从而将所需的比较次数减少到非常少。

算法

Binary Search ( A: array of item, n: total no. of items ,x: item to be searched)
Step 1: Set lowerBound = 1
Step 2: Set upperBound = n 
Step 3: if upperBound < lowerBound go to step 12
Step 4: set midPoint = ( lowerBound + upperBound ) / 2
Step 5: if A[midPoint] < x
Step 6: set lowerBound = midPoint + 1
Step 7: if A[midPoint] > x
Step 8: set upperBound = midPoint - 1 
Step 9  if A[midPoint] = x go to step 11
Step 10: Go to Step 3
Step 11: Print Element x Found at index midPoint and go to step 13
Step 12: Print element not found
Step 13: Exit

演示程序

package com.tutorialspoint.simplesearch;

import java.util.Arrays;

public class BinarySearchDemo {
    
   public static void main(String args[]){
      int[] sourceArray = {1,2,3,4,6,7,9,11,12,14,15,
      16,17,19,33,34,43,45,55,66,76,88};
      System.out.println("Input Array: " +Arrays.toString(sourceArray));
      printline(50);
      // find location of 55 
      int location = find(sourceArray, 55);
      if(location != -1){
         System.out.println("Element found at location: " +(location+1));
      }else {
         System.out.println("Element not found.");
      }    
   }

   public static int find(int[] intArray, int data){
      int lowerBound = 0;
      int upperBound = intArray.length -1;
      int midPoint = -1;
      int comparisons = 0;      
      int index = -1;
      while(lowerBound <= upperBound){
         System.out.println("Comparison " + (comparisons +1) ) ;
         System.out.println("lowerBound : "+lowerBound  
                           + " , intArray[" + lowerBound+"] = " 
                           + intArray[lowerBound]) ;
         System.out.println("upperBound : "+upperBound  
                           + " , intArray[" + upperBound+"] = " 
                           + intArray[upperBound]) ;
         comparisons++;
         // compute the mid point 
         midPoint = (lowerBound + upperBound) / 2;
         // data found
         if(intArray[midPoint] == data){
		    index = midPoint;
            break;
         }
         else {
            // if data is larger 
            if(intArray[midPoint] < data){
               // data is in upper half
               lowerBound = midPoint + 1;
            }
            // data is smaller 
            else{           
               // data is in lower half 
               upperBound = midPoint -1;
            }
         }               
      }
      System.out.println("Total comparisons made: " + comparisons);
      return index;
   }
   
   public static void printline(int count){
      for(int i=0;i <count-1;i++){
         System.out.print("=");
      }
      System.out.println("=");
   }
}

如果我们编译并运行上述程序,它将产生以下结果

Input Array: [1, 2, 3, 4, 6, 7, 9, 11, 12, 14, 15, 16, 17, 19, 33, 34, 43, 45, 55, 66, 76, 88]
==================================================
Comparison 1
lowerBound : 0 , intArray[0] = 1
upperBound : 21 , intArray[21] = 88
Comparison 2
lowerBound : 11 , intArray[11] = 16
upperBound : 21 , intArray[21] = 88
Comparison 3
lowerBound : 17 , intArray[17] = 45
upperBound : 21 , intArray[21] = 88
Comparison 4
lowerBound : 17 , intArray[17] = 45
upperBound : 18 , intArray[18] = 55
Comparison 5
lowerBound : 18 , intArray[18] = 55
upperBound : 18 , intArray[18] = 55
Total comparisons made: 5
Element found at location: 19
广告