查找算法
二分查找
有序数组进行二分查找
二分查找有两种 一种是递归,一种 是非递归
二分查找的思路分析
- 首先确定该数组的中间的下标 mid =(left+right)/2
- 接着让需要查找的数findVal和arr[mid]比较
- findVal > arr[mid] 说明要找的数在mid右边,需要向右递归查找,findVal < arr[mid] 说明要找的数在mid左边,需要向左递归查找 findVal=arr[mid]说明找到,就返回
- 当 left>right就需要退出
代码实现
public class BinarySearch {
public static void main(String[] args) {
int arr[] = {1,8,10,89,1000,1234};
System.out.println(binarySearch(arr, 0, arr.length-1, 88));
}
//二分查找
public static int binarySearch(int[] arr, int left,int right,int findVal){
if (left > right){
return -1;
}
int mid = (left+right)/2;
int midVal =arr[mid];
if (findVal > midVal) {//向右递归
return binarySearch(arr, mid+1, right, findVal);
}else if (findVal < midVal){
return binarySearch(arr, left, mid-1, findVal);
}else {
return mid;
}
}
}找到数组中相同的所有的值 并返回下标
public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal){
if (left > right){
return new ArrayList<Integer>();
}
int mid = (left+right)/2;
int midVal =arr[mid];
if (findVal > midVal) {//向右递归
return binarySearch2(arr, mid+1, right, findVal);
}else if (findVal < midVal){
return binarySearch2(arr, left, mid-1, findVal);
}else {
ArrayList<Integer> list =new ArrayList<Integer>();
int temp = mid - 1;
while (true){
if (temp <0 || arr[temp]!=findVal){
break;
}
list.add(temp);
temp-=1;
}
list.add(mid);
temp = mid +1;
while (true){
if(temp >arr.length-1 ||arr[temp] != findVal){
break;
}
list.add(temp);
temp += 1;
}
return list;
}
}
插值查找
- 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。
- 公式为 int mid = left +(right - left) *(findVal -arr[left])/(arr[right] -arr[left])
斐波那契查找算法(黄金分割法)
代码实现
import java.util.Arrays; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 李福腾の博客!