顺序(线性)查找
public static int seqSearch(int[] arr,int val){
for(int i=0;i<arr.length;i++)
if(arr[i]==val)
return i;
return -1;
}
二分查找(有序数组)
public static int binarySearch(int[] arr,int val){
return binarySearch(arr,0,arr.length-1,val);
}
public static int binarySearch(int[] arr,int left,int right,int val){
if(left>right||val<arr[0]||val>arr[arr.length-1])
return -1;
int mid=(left+right)/2;
if(val>arr[mid])
return binarySearch(arr,mid+1,right,val);
else if(val<arr[mid])
return binarySearch(arr,left,mid-1,val);
else
return mid;
}
插值查找
public static int insertValueSearch(int[] arr,int val){
return insertValueSearch(arr,0,arr.length-1,val);
}
public static int insertValueSearch(int[] arr,int left,int right,int val){
if(left>right||val<arr[0]||val>arr[arr.length-1])
return -1;
int mid=left+(val-arr[left])*(right-left)/(arr[right]-arr[left]);
if(val>arr[mid])
return insertValueSearch(arr,mid+1,right,val);
else if(val<arr[mid])
return insertValueSearch(arr,left,mid-1,val);
else
return mid;
}
斐波那契查找(黄金分割法)*
public static int[] fib(){
int[] f=new int[maxSize];
f[0]=1;
f[1]=1;
for(int i=2;i<maxSize;i++)
f[i]=f[i-1]+f[i-2];
return f;
}
public static int fibonacciSearch(int[] arr,int val){
int low=0;
int high=arr.length-1;
int k=0,mid=0;
int[] f=fib();
while(high>f[k]-1)
k++;
int temp[]= Arrays.copyOf(arr,f[k]);
for(int i=high-1;i<temp.length;i++)
temp[i]=arr[high];
while(low<=high){
mid=low+f[k-1]-1;
if(val<temp[mid]){
high=mid-1;
k--;
}
else if(val>temp[mid]){
low=mid+1;
k-=2;
}
else
{
if(mid<=high)
return mid;
else
return high;
}
}
return -1;
}