如果待搜索的数据列是升序或者降序排序的数据列,那么可以用二分搜索(binary search)算法快速搜索出目标数据。
二分搜索专注于数据列中间位置的数据M1,如果中间位置的数据和目标数据T一致,搜索结束,否则缩小搜索范围找起始或者末尾位置与M1之间的中间位置的数据M2,接着是M3,…,等等,一边和T比较大小,一边折半缩小搜索范围。
具体实现
package com.lishu.search;
/**
* @Author : chenlishu
* @Date: 2021-09-15
* @Description : 二分查找算法
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1,5,7,10,15,17,18};
int num = binarySearch(arr, 0, arr.length - 1, 17);
System.out.println(num);
}
/**
* 二分查找
* @param arr
* @param start
* @param end
* @param num
* @return
*/
public static int binarySearch(int[] arr,int start,int end,int num){
if(arr.length < 0){
return -1;
}
//如果开始索引和结束索引为同一位置,说明只剩一个元素没有比较了。将当前元素与待搜索值num进行比较,为true返回当前索引位置,否则返回-1
if(end - start < 1){
return arr[start] == num ? start : -1;
}
//计算中间位置middle
int middle = (end + start) / 2;
//如果待搜索元素小于当前中间元素,说明待搜索元素在当前中间元素的右列表中,继续递归查找
if(num < arr[middle]){
return binarySearch(arr,start,middle - 1,num);
}
//如果待搜索元素大于当前中间元素,说明待搜索元素在当前中间元素的左边列表中,继续递归查找
if(num > arr[middle]){
return binarySearch(arr,middle + 1,end,num);
}
//走到这里说明 待搜索元素等于当前中间元素 直接返回当前中间位置middle
return middle;
}
}