一、种类
(1)线性查找;
(2)二分查找;
(3)插值查找;
(4)斐波那契查找。
二、实现
1.线性查找
代码如下(示例):
public static int seqSearch(int[] arr, int index){
for (int i = 0; i < arr.length; i++) {
if(i == index){
return arr[i];
}
}
return -1;
}
2.二分查找
代码如下(示例):
//二分查找
public static int binarySearch(int[] arr,int left,int right,int num){
int mid = (left + right) / 2;
int val = arr[mid];
int[] counts = new int[arr.length];
int i = 0;
// 没找到返回-1
if(left > right){
System.out.println("没有找到");
return -1;
}
// 在左边
if(num < val){
return binarySearch(arr,left,mid,num);
}else if(num > val){// 在右边
return binarySearch(arr,mid,right,num);
}else { // 恰好在中间
return mid;
}
}
// 二分查找(重复的元素也都查找出来)
public static ArrayList<Integer> repeateBinarySearch(int[] arr,int left,int right,int num){
ArrayList<Integer> list = new ArrayList<>();
int mid = (left + right) / 2;
int val = arr[mid];
// 没找到返回-1
if(left > right){
return new ArrayList<>();
}
// 在左边
if(num < val){
return repeateBinarySearch(arr,left,mid,num);
}else if(num > val){// 在右边
return repeateBinarySearch(arr,mid,right,num);
}else { // 恰好在中间
list.add(mid);
int count = mid-1;
while (count > left){
if(arr[count] == num){
list.add(count);
}
count--;
}
count = mid+1;
while (count < right){
if(arr[count] == num){
list.add(count);
}
count++;
}
return list;
}
}