• 对于有序数列,才能使用二分查找法(排序的作用)

    image.png
    image.png

    1. package com.hoho.algorithms.binarysearch;
    2. public class BinarySearch {
    3. public BinarySearch() {
    4. }
    5. public static <E extends Comparable<E>> int searchR(E[] data, E target) {
    6. return searchR(data, 0, data.length - 1, target);
    7. }
    8. /**
    9. * 递归
    10. */
    11. private static <E extends Comparable<E>> int searchR(E[] data, int l, int r, E target) {
    12. if (l > r) return -1;
    13. int mid = l + (r - l) / 2;
    14. if (data[mid].compareTo(target) == 0) return mid;
    15. if (data[mid].compareTo(target) < 0) return searchR(data, mid + 1, r, target);
    16. return searchR(data, l, mid - 1, target);
    17. }
    18. /**
    19. * 重点:非递归 关注查找的范围与每次变动时左右边界的取值
    20. */
    21. public static int binarySearch(Comparable[] arr, int n, Comparable target){
    22. int l = 0, r = n - 1; // 在[l...r]的范围里寻找target
    23. while(l <= r){ // 当 l == r时,区间[l...r]依然是有效的
    24. int mid = l + (r - l) / 2;
    25. if(arr[mid].compareTo(target) == 0) return mid;
    26. if(target.compareTo(arr[mid]) > 0)
    27. l = mid + 1; // target在[mid+1...r]中; [l...mid]一定没有target
    28. else // target < arr[mid]
    29. r = mid - 1; // target在[l...mid-1]中; [mid...r]一定没有target
    30. }
    31. return -1;
    32. }
    33. /**
    34. * 更改边界范围
    35. */
    36. public static int binarySearch(Comparable[] arr, int n, Comparable target){
    37. int l = 0, r = n; // 在[l...r)的范围里寻找target
    38. while(l < r){ // 当 l == r 时, 区间[l...r)是一个无效区间
    39. int mid = l + (r - l) / 2;
    40. if(arr[mid].compareTo(target) == 0) return mid;
    41. if(target.compareTo(arr[mid]) > 0)
    42. l = mid + 1; // target在[mid+1...r)中; [l...mid]一定没有target
    43. else // target < arr[mid]
    44. r = mid; // target在[l...mid)中; [mid...r)一定没有target
    45. }
    46. return -1;
    47. }
    48. }