目录
什么是二分法查找
二分查找是一种非常快速的查找算法,二分查找又叫折半查找。它对要查找的序列有两个要求:
(1)是该序列必须是有序的
(2)二是该序列必须是顺序存储的
二分查找原理
(1)必须查找的序列必须是有序的,顺序倒序都可以,如果是乱序的则需要先进行排序
(2)定义三个变量,low,mid,high
low:最初指向序列第一个元素
mid:最初指向整个序列的中间元素
high:最初指向序列最后一个元素
(3)将需要查找的目标元素target,与mid进行比较
①如果需要查找的元素 target < mid 则:low指向的位置不变,high指向mid-1,而mid指向新的low与high元素中间位置的元素
①如果需要查找的元素 target > mid 则:high指向的位置不变,low指向 mid + 1,而mid指向新的low与high元素中间位置的元素
(4)按照上诉步骤循环,直到找到目标元素
(5)如果该序列中不存在目标元素,则返回 -1
顺序情况下元素不存在的条件:
(1)target > high
(2)target < low
(3)low > high
代码实现
import java.util.Arrays; import java.util.Scanner; public class 二分法查找 { public static void main(String[] args) { //定义一个一维数组 int[] arr = {2,5,8,44,556,343,32,56}; Scanner s = new Scanner(System.in); System.out.print("请输入需要查找的数字:"); int num = s.nextInt(); //排序 Arrays.sort(arr); //定义三个变量 int low = 0; int high = arr.length-1; int mid = (arr.length-1)/2; //查找的数字不存在的情况 if ( num < arr[low] || num > arr[high] || low >high) { System.out.println("您查找的数字不存在"); } //进入循环 while (low <= high){ //大于情况 if( num > arr[mid] ){ low = mid+1 ; mid = (low + high)/2 ; } //等于情况 输出 else if(arr[mid]==num){ System.out.println("您查找的数字下标为:" + mid); break; } //小于情况 else { high = mid-1 ; mid = (low + high)/2 ; } } } }
结果图:
力扣二分法查找题目
原理一样,力扣中相当于让你写一个二分法查找的方法,也就不用再排序了
如图:
代码:
class Solution { public int search(int[] nums, int target) { int low = 0; int high = nums.length-1; int mid = (nums.length-1)/2; while (low <= high){ if( target > nums[mid] ){ low = mid+1 ; mid = (low + high)/2 ; } else if(nums[mid]==target){ return mid; } else{ high = mid-1 ; mid = (low + high)/2 ; } } return -1; } }
结果: