1·二分查找
优势:提高查找效率
二分查找的前提条件:数据必须是有序的,如果数据是乱的,重新排序后得到的索引无意义
核心: mid每次都指向范围的中间位置
int[] arr={1,2,3,4,5,6,7,8,9};
int num=100;
int i = binarySearch(arr, num);
System.out.println(i);
System.out.println(arr[i]);
}
public static int binarySearch(int[] arr,int num){
int min=0;
int max=arr.length-1;
do{
if(min>max){
return -1;
}
int mid=(max+min)/2;
if(arr[mid]==num){
return mid;
}else if(arr[mid]<num){
min=mid+1;
}else if(arr[mid]>num){
max = mid - 1;
}
}while (true);
}
二分查找的改进: mid =min+(key-arr[min])/(arr[max]-arr[min])*(max-min)
要求:mid尽可能靠近要查找的数据,但是要求数据尽可能分布的均匀
斐波那契额查找:根据黄金分割点来计算mid指向的位置
2·基本查找(顺序查找):
核心:从0索引开始查找
int arr[]={135,88,4646,1545,123};
int num=15;
System.out.println(basicFind(arr,num));
}
private static boolean basicFind(int[] arr,int num) {
for (int i = 0; i < arr.length; i++) {
if(num==arr[i]){
return true;
}
}
return false;
}
3·使用二分查找时,数组中有重复数据
核心:创建一个数组,把索引添加到数组中,返回数组即可
int arr[]={1,2,4,5,1,3,9,4,1};
int num=1;
ArrayList<Integer> arr2=basicFind(arr,num);
for (int i = 0; i < arr2.size(); i++) {
System.out.println(arr2.get(i));
}
}
private static ArrayList<Integer> basicFind(int[] arr, int num) {
ArrayList<Integer> arrayList=new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if(arr[i]==num){
arrayList.add(i);
}
}
return arrayList;
}