1、二分查找
//二分查找,num是要查找的值
public static int binarySelect(int[] arr, int num ,int left,int right){
if(left>right){
return -1;
}
int mind = (right+left)/2;
if(arr[mind]>num){//向左递归
return binarySelect(arr, num, left, mind-1);
}else if(arr[mind]<num){//向右递归
return binarySelect(arr,num,mind+1,right);
}else{
return mind;
//如果数组中有多个相同的值,
// 可以在此处放置List,查到后向左向右遍历是否有相同的值,并放入List返回,直到遍历完或不等于要查找的值后返回
}
}
2、插值查找:
//插值查找,插值查找避免了要查找的值在数组两边的多次查找的情况,和二分查找不同的是修改了mind中间值的计算公式,
// 数组分布均匀的用插值查找比较好,不均匀的不一定比二分好
public static boolean insertValueSearch(int[] array, int num ,int left ,int right){
if(left>right){
return false;
}
int mind = left+(right-left)*(num-array[left])/(array[right]-array[left]);//和二分法不同的地方
if(array[mind]>num){//向左递归
return insertValueSearch(array, num, left, mind-1);
}else if(array[mind]<num){//向右递归
return insertValueSearch(array,num,mind+1,right);
}else{
return true;
}
}
3、
//斐波那契(黄金分割法)查找,和二分法不同的是mind遵循黄金分割:一部分与全长之比等于另一部分与这部分之比,约等于0.618,要先构建菲波那切数组