二分查找:
https://blog.csdn.net/u014067137/article/details/80332251
前提:待查的表必须是有序表
因此折半查找适用于不经常变动,并且查找频繁的有序表
思想:
首先待查找的元素与表的中点位置比较,大于中点位置,直接查找右边,小于的话在左边找(升序)。缩小了比较的次数。
代码:
非递归的实现:
时间复杂度为O(log2n)
import java.util.Arrays;
import java.util.Scanner;
public class OKgroup {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// int[] array = Arrays.stream(input.nextLine().replace("[", "").replace("]", "").split(",")).mapToInt(Integer::parseInt).toArray();
String s = input.nextLine();
char[] c = s.toCharArray();
int[] a = new int[c.length];
for(int i=0; i<c.length; i++){
a[i] = Integer.parseInt(c[i]+"");
}
int val = Integer.parseInt(input.nextLine());
System.out.println(binarySearch(a, val));
System.err.println("**********");
System.out.println(binarySearch1(a, val,0,a.length-1));
}
static int binarySearch(int[] a, int key) {
if(a==null || a.length<=0){
return -1;
}
int len = a.length;
int mid = len/2;
if(key == a[mid]){
return mid;
}
int low = 0, high = len-1;
while(low <= high){
mid = low + (high-low)/2;
if(key == a[mid]){
return mid;
}else if(key > a[mid]){
low = mid+1;
}else{
high = mid-1;
}
}
return -1;
}
}
递归实现:
static int binarySearch1(int[] a, int key,int start,int end) {
if(a == null || a.length<=0){
return -1;
}
int mid = start + (end-start)/2;
if(key == a[mid]){
return mid;
}
if(start >= end){
return -1;
}
if(key > a[mid]){
start = mid+1;
return binarySearch1(a,key,start,end);
}else{
end = mid-1 ;
return binarySearch1(a,key,start,end);
}
}