java 二分法详解几种方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36146261/article/details/79964261

二分查找(java实现)

 二分查找

算法思想:又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。

实现:

 1.非递归代码

//传入数组及要查找的数字
 private static int searchNumber(int[] array, int searchValue) {
       if (array == null)
           return -1;
       int start = 0;
       int end = array.length - 1;
       int mid = 0;
       while (start <= end) {
           // 每次取中间位置进行查找
           mid = (start + end) / 2;
           if (searchValue < array[mid]) {
               end = mid - 1;
           } else if (searchValue > array[mid]) {
               start = mid + 1;
           } else {
               return mid;
           }
       }
       return -1;
   }
 
 //递归实现
 private static int searchRecursion(int[] array, int start, int end, int searchValue) {
       if (array == null)
           return -1;
       if (start <= end) {
           // 每次取中间位置进行查找
           int mid = (start + end) / 2;
           if (searchValue < array[mid]) {
               return searchRecursion(array, start, mid - 1, searchValue);
           } else if (searchValue > array[mid]) {
               return searchRecursion(array, mid + 1, end, searchValue);
           } else {
               return mid;
           }
       }
       return -1;
   }时间复杂度为 O(logN)  

 查找第一个元素出现的位置(元素允许重复)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public static int biSearch(int []array,int a){

    int n=array.length;

    int low=0;

    int hi=n-1;

    int mid=0;

    while(low<hi){

      mid=(low+hi)/2;

      if(array[mid]<a){

        low=mid+1;

      }else{

        hi=mid;

      }

    }

    if(array[low]!=a){

      return -1;

    }else{

      return low;

    }

  }

查询元素最后一次出现的位置

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public static int biSearch(int []array,int a){

    int n=array.length;

    int low=0;

    int hi=n-1;

    int mid=0;

    while(low<hi){

      mid=(low+hi+1)/2;

      if(array[mid]<=a){

        low=mid;

      }else{

        hi=mid-1;

      }

    }

   

    if(array[low]!=a){

      return -1;

    }else{

      return hi;

    }

  }

猜你喜欢

转载自blog.csdn.net/qq_36146261/article/details/79964261