常见查找算法:顺序查找,二分查找,哈希表查找,二叉排序树查找。
二分查找:
算法思想:又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
时间复杂度为 O(logN)
可以分为非递归二分查找和递归二分查找
//非递归二分查找
public class binarySearch {
public static int search(int[] array,int key){
int low=0;
int high=array.length;
while(high>=low){
int mid=(high+low)/2;
if(array[mid]==key){
return mid;
}
else if(key<array[mid]){
high=mid-1;
}else {
low=mid+1;
}
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array1={1,3,5,7,8,9};
int[] array2={9,8,7,5,3,1};
System.out.println(search(array1,3));
}
}
//递归二分查找
public class binarySearch2 {
public static int search(int[] array,int key,int low,int high){
while(high>=low){
int mid=(high+low)/2;
if(key==array[mid]){
return mid;
}else if(key<array[mid]){
return search(array,key,low,high-1);
}else{
return search(array,key,low+1,high);
}
}
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array={1,3,5,7,8,9};
System.out.println(search(array,3,0,array.length-1));
}
}
对于数组元素有重复的情况,查找第一个元素出现的位置
public static int biSearch(int []array,int a){
int n=array.length;
int low=0;
int hi=n-1;
int mid=0;
while(low<hi){
mid=(low+hi)/2;
if(array[mid]<a){
low=mid+1;
}else{
hi=mid;
}
}
if(array[low]!=a){
return -1;
}else{
return low;
}
}
查询元素最后一次出现的位置
public static int biSearch(int []array,int a){
int n=array.length;
int low=0;
int hi=n-1;
int mid=0;
while(low<hi){
mid=(low+hi+1)/2;
if(array[mid]<=a){
low=mid;
}else{
hi=mid-1;
}
}
if(array[low]!=a){
return -1;
}else{
return hi;
}
}