查找算法-二分查找
二分查找算法
二分查找:
请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。
二分查找算法的思路
- 二分查找的代码
说明:增加了找到所有的满足条件的元素下标:
课后思考题: {1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值
都查找到,比如这里的 1000.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package com.xuge.search; /** * author: yjx * Date :2022/5/3113:25 **/ public class BinarySearch { public static void main(String[] args) { int []arr={ 1 , 2 , 6 , 7 , 9 , 10 }; int index = binarySearch(arr, 0 , arr.length - 1 , 70 ); if (index==- 1 ){ System.out.println( "要查询的数" + 70 + "没有找到.." ); } else { System.out.println( "要找的数找到了," +index); } } /** * 二分查找算法 * @param arr 查找的数组 * @param left 左边索引 * @param right 右边索引 * @param findVal 查找的数 * @return 返回索引 |-1 */ public static int binarySearch( int []arr, int left, int right, int findVal){ //当left大于right,表明没有找到 if (left>right){ return - 1 ; } int mid=(right+left)/ 2 ; int midVal=arr[mid]; if (midVal<findVal){ //要找的值大于中间索引,向右递归 return binarySearch(arr, mid+ 1 ,right,findVal); } else if (midVal>findVal){ return binarySearch(arr, left,mid- 1 ,findVal); } else { return mid; } } } |
二分查找算法完善
课后思考题: {1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值
都查找到,比如这里的 1000.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | /**要求:多次查找多个相同数据 * 课后思考题: {1,8, 10, 89, 1000, 1000,1234} * 当一个有序数组中,有多个相同的数值时,如何将所有的数值 * * 思路分析 * 1. 在找到 mid 索引值,不要马上返回 * 2. 向 mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合 ArrayList * 3. 向 mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合 ArrayList * 4. 将 Arraylist 返回 * * 二分查找算法 * @param arr 查找的数组 * @param left 左边索引 * @param right 右边索引 * @param findVal 查找的数 * @return 返回索引 |-1 */ public static List<Integer> binarySearch2( int []arr, int left, int right, int findVal){ //当left大于right,表明没有找到 if (left>right){ return new ArrayList<>(); } int mid=(right+left)/ 2 ; int midVal=arr[mid]; if (midVal<findVal){ //要找的值大于中间索引,向右递归 return binarySearch2(arr, mid+ 1 ,right,findVal); } else if (midVal>findVal){ return binarySearch2(arr, left,mid- 1 ,findVal); } else { /* 1. 在找到 mid 索引值,不要马上返回 * 2. 向 mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合 ArrayList * 3. 向 mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合 ArrayList * 4. 将 Arraylist 返回 */ List<Integer > list= new ArrayList<>(); //向mid索引值左边扫描,将所有满足1000,的元素下标,放入到集合list中 int temp=mid- 1 ; while ( true ){ if (temp< 0 ||arr[temp]!=findVal){ //说明左边扫描结束 break ; } else { //否则将temp放入到集合中 list.add(temp); temp-= 1 ; } //放入中间扫描索引 list.add(mid); } temp=mid+ 1 ; while ( true ){ if (temp>arr.length- 1 ||arr[temp]!=findVal){ //说明左边扫描结束 break ; } else { //否则将temp放入到集合中 list.add(temp); temp+= 1 ; } //放入中间扫描索引 list.add(mid); } return list; } } |