java 二分查找源码分析

版权声明:博主GitHub网址https://github.com/29DCH,欢迎大家前来交流探讨和fork。 https://blog.csdn.net/CowBoySoBusy/article/details/82180386

二分查找又称为折半查找.在数组接近有序时有很好的效率

时间复杂度为O()=O(logn)

注意事项:
      * 如果数组无序,就不能使用二分查找。
      * 因为如果你排序了,但是你排序的时候已经改变了最原始的元素索引。

java源码分析:

import java.util.Arrays;

public class Test {
    
    // Like public version, but without range checks.
     private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
     int low = fromIndex;				//最小索引0
     int high = toIndex - 1;		    //最大索引数组长度-1

     while (low <= high) {				//最小索引小于等于最大索引可以循环判断
     int mid = (low + high) >>> 1;	//求出中间索引值,(最小+最大)/2
     int midVal = a[mid];			//通过中间索引获取中间值

     if (midVal < key)				//中间索引对应的值小于查找的值
     low = mid + 1;				//最小索引变化
     else if (midVal > key)			//中间索引对应的值大于查找的值
     high = mid - 1;				//最大索引变化
     else
     return mid; // key found	//找到了
     }
     return -(low + 1);  // key not found.//-插入点 - 1
     }

    public static void main(String[] args) {
        int[] arr = {33,22,11,44,66,55};
        System.out.println(Arrays.toString(arr));			//数组转字符串
        Arrays.sort(arr);									//快速排序
        System.out.println(Arrays.toString(arr));

        int[] arr2 = {11,22,33,44,55,66};
        System.out.println(Arrays.binarySearch(arr2, 22));
        /**
         binarySearch底层就是调用binarySearch0(二分查找源码)方法
         public static int binarySearch(int[] a, int key) {
         return binarySearch0(a, 0, a.length, key);
         }
         */
        System.out.println(Arrays.binarySearch(arr2, 66));
        System.out.println(Arrays.binarySearch(arr2, 9));	//插入点-1(0-1=-1)
    }

}

输出:

[33, 22, 11, 44, 66, 55]
[11, 22, 33, 44, 55, 66]
1
5
-1

猜你喜欢

转载自blog.csdn.net/CowBoySoBusy/article/details/82180386
今日推荐