第二种查找算法:二分查找:
/**
* 2. 二分查找(折半查找)
* 基本思想:
* 在有序数组中,取中间数值作为比较对象,若给定值与中间数值相等,则查找成功;
* 若给定值小于中间数值,则在中间数值的左半区继续查找;
* 若给定值大于中间数值,则在中间数值的右半区继续查找。
* 不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
*
* 时间复杂度:O(log2 n)
*
*/
二分查找示例代码如下:
import java.util.Arrays;
import java.util.Scanner;
/**
* 2.二分查找(折半查找)
* 基本思想:
* 在有序数组中,取中间数值作为比较对象,若给定值与中间数值相等,则查找成功;
* 若给定值小于中间数值,则在中间数值的左半区继续查找;
* 若给定值大于中间数值,则在中间数值的右半区继续查找。
* 不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
*
* 时间复杂度:O(log2 n)
*
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {5,3,6,1,9,8,2,4,7};
//先打印输出原始数组数据
System.out.println("数组排序前顺序:");
for (int n : arr) {
System.out.print(n+" ");
}
//首先对数组进行排序
Arrays.sort(arr);
//遍历输出排序好的数组
System.out.println("\n数组排序后顺序:");
for(int n : arr){
System.out.print(n+" ");
}
System.out.println("\n请输入你要查找的数字:");
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
//调用binarySearch()方法,将返回值保存在result中
int result = binarySearch(arr, num);
if(result == -1){
System.out.println("查找失败!");
}
else{
System.out.println("查找成功,数字位于排序后第"+(result+1)+"位!");
}
}
//折半查找
private static int binarySearch(int[] arr,int num){
int lower = 0;
int upper = arr.length-1;
while(lower <= upper){ //此处必须用<=,因为有可能相等
int mid = (upper+lower)/2;
if(arr[mid] < num){
lower = mid+1;
}else if(arr[mid] > num){
upper = mid-1;
}else{
return mid;
}
}
return -1;
}
}