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