二分查找要先排序,再查找
    image.png

    1. package com.itheima.d8_sort_binarysearch;
    2. /**
    3. * 目标:理解二分搜索的原理并实现
    4. */
    5. public class Test2 {
    6. public static void main(String[] args) {
    7. // 1.定义数组 // 使用二分查找要先排序
    8. int[] arr = {10,14,16,18,20,22,24,26,28};
    9. System.out.println(binarySearch(arr, 28));
    10. }
    11. /**
    12. * 二分查找算法的实现
    13. * @param arr 排序的数组
    14. * @param data 要找的数据
    15. * @return 索引, 如果元素不存在,直接返回-1
    16. */
    17. // 使用二分查找,最好是定义成方法
    18. public static int binarySearch(int[] arr, int data){
    19. // 1. 定义左边位置 和 右边位置
    20. int left = 0;
    21. int right = arr.length - 1; // 获取右边最后一个元素的索引
    22. // 2. 开始循环,折半查询
    23. while (left <= right){
    24. // 取中间索引
    25. int middleIndex = (left + right) / 2; // 不精确没关系,差不多中间位置即可
    26. // 3. 判断当前中间位置的元素和要找的元素的大小情况
    27. if (data > arr[middleIndex]) {
    28. // 如果要找的数据元素,大于 中间索引
    29. // 则往右边找,左边位置更新为 = 中间索引 + 1 . 加完1 后 执行上面的代码left <= right再次比较
    30. left = middleIndex + 1;
    31. }else if (data < arr[middleIndex]){
    32. // 如果要找的元素 小于中间元素
    33. // 则往左边找 , 右边位置更新为 = 中间索引 - 1 减完1 后 执行上面的代码left <= right再次比较
    34. right = middleIndex -1;
    35. }else {
    36. // 当要找到数据元素等于中间元素,则直接返回
    37. return middleIndex;
    38. }
    39. }
    40. // 当都没有找到时:返回-1
    41. return -1;
    42. }
    43. }