分治算法:
把一个大问题分解为两个相对较小的问题,分别解决每一个小问题,对两个小问题的处理方式也一样:分解为两个更小的问题,并解决它们
这个过程一直持续下去直到达到易于求解的基值情况,就不用继续分解下去了
二分查找是分治算法的一个实例
循环二分查找
public class BinarySearch {
private int[] data;
public BinarySearch(int[] data){
this.data = data;
}
public int search(int target){
int min = 0;
int max = data.length - 1;
int n = 0;
while(true){
n = (min + max)/2;
if(target > data[n])
min = n + 1;
if(target < data[n])
max = n - 1;
if(target == data[n])
return n;
if(max < min)
return -1;
}
}
public static void main(String[] args) {
int[] ints = {1,2,7,9,25,44,66,99};
BinarySearch bs = new BinarySearch(ints);
System.out.println(bs.search(50));
System.out.println(bs.search(44));
}
}
-1
5
递归二分查找
public class BinarySearch {
private int[] data;
public BinarySearch(int[] data){
this.data = data;
}
public int search(int target,int min,int max){
if(min > max)
return -1;
int n = (min + max)/2;
if(target > data[n])
min = n + 1;
if(target < data[n])
max = n -1;
if(target == data[n])
return n;
else
return search(target,min,max);
}
public static void main(String[] args) {
int[] ints = {1,2,7,9,25,44,66,99};
BinarySearch bs = new BinarySearch(ints);
System.out.println(bs.search(50,0,ints.length-1));
System.out.println(bs.search(44,0,ints.length-1));
}
}
-1
5