java 实现二分查找


一般情况

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。

算法时间复杂度:Log2n

package com.search;

import java.util.Arrays;
import java.util.Scanner;

public class BinarySearch {
	public static void main(String []args) {
		int arr[] = {8,3,6,2,1,85,63,33,12,54};
		System.out.print("请输入查找的数:");
		Scanner scanner = new Scanner(System.in);
		int target = scanner.nextInt();
		binarySearch(arr,target);
		
	}
	private static int binarySearch(int []a,int n) {
		//先对已知数组排好序
		Arrays.sort(a);
		int left = 0;
		int right = a.length - 1;
		while(left <= right) {
			int middle = (left+right)/2;
			if(n == a[middle]) {
				System.out.println("找到了,在a["+middle+"]的位置。");
				return middle;
			}
			if(n > a[middle]) {
				//n在后半部分
				left = middle + 1;
			} else {
				//n在前半部分
				right = middle - 1;
			}
		}
		System.out.println("没有找到!");
		return -1;//没有找到
	}

}

二分查找升级版(针对大量的数据)【1】

public class Search {
    /**
     * 二分查找法模板
     * @param arr 有序数组
     * @param target 待查找的目标值
     * @return
     */
     public int binarySearch(int[] arr, int target) {
         int len = arr.length;

         int left = 0;
         int right = len - 1;
         while(left < right) {
             int mid = (left + right + 1) >>> 1; // 防止溢出
             if(arr[mid] > target) {
                 right = mid - 1;
             } else {
                 left = mid;
             }
         }
         if(arr[left] == target) {
             return left;
         }
         return -1;
     }

通用二分查找【2】

/**
     * This method implements the Generic Binary Search
     *
     * @param array The array to make the binary search
     * @param key The number you are looking for
     * @param left The lower bound
     * @param right The  upper bound
     * @return the location of the key
     **/
    private > int search(T array[], T key, int left, int right){
        if (right < left) return -1; // this means that the key not found

        // find median
        int median = (left + right) >>> 1;
        int comp = key.compareTo(array[median]);

        if (comp == 0) {
            return median;
        } else if (comp < 0) {
            return search(array, key, left, median - 1);
        } else {
            return search(array, key, median + 1, right);
        }
    }

参考链接:

【1】 https://leetcode-cn.com/problems

【2】https://github.com/TheAlgorithms/Java

 

你可能感兴趣的:(java,数据结构和算法,数据结构,java,二分搜索)