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,要先構建菲波那切數組