二分查找(递归和非递归)

素颜马尾好姑娘i 2023-07-24 11:45 157阅读 0赞

二分查找

(非递归)

  1. 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找
  2. 二分查找法的运行时间为对数时间 O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n 步,假设从[0,99]的 队列(100 个数,即
    n=100)中寻到目标数 30,则需要查找步数为㏒₂100 , 即最多需要查找 7 次( 2^6 < 100 < 2^7)
    代码分析

    package com.atguigu.binarysearchnorecursion;

    public class BinarySearchNoRecur {

    1. public static void main(String[] args) {
    2. //测试
    3. int[] arr = { 1,3, 8, 10, 11, 67, 100};
    4. int index = binarySearch(arr, 100);
    5. System.out.println("index=" + index);//
    6. }
    7. //二分查找的非递归实现
    8. /** * * @param arr 待查找的数组, arr是升序排序 * @param target 需要查找的数 * @return 返回对应下标,-1表示没有找到 */
    9. public static int binarySearch(int[] arr, int target) {
    10. //左数
    11. int left = 0;
    12. //右数
    13. int right = arr.length - 1;
    14. while(left <= right) { //说明继续查找
    15. //中间值
    16. int mid = (left + right) / 2;
    17. //如果要查找的值是等于中间的值 则直接返回这个值
    18. if(arr[mid] == target) {
    19. return mid;
    20. //如果数组中间的值 大于要查找的值
    21. } else if ( arr[mid] > target) {
    22. right = mid - 1;//需要向左边查找
    23. } else {
    24. left = mid + 1; //需要向右边查找
    25. }
    26. }
    27. return -1;
    28. }

    }

(递归的方式)
在这里插入图片描述

  1. package com.atguigu.search;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. //注意:使用二分查找的前提是 该数组是有序的.
  5. public class BinarySearch {
  6. public static void main(String[] args) {
  7. int arr[] = { 1, 8, 10, 89,1000,1000, 1234 };
  8. int resIndex = binarySearch(arr, 0, arr.length - 1, 1000);
  9. System.out.println("resIndex=" + resIndex);
  10. }
  11. // 二分查找算法
  12. /** * @param arr * 数组 * @param left * 左边的索引 * @param right * 右边的索引 * @param findVal * 要查找的值 * @return 如果找到就返回下标,如果没有找到,就返回 -1 */
  13. public static int binarySearch(int[] arr, int left, int right, int findVal) {
  14. // 当 left > right 时,说明递归整个数组,但是没有找到
  15. if (left > right) {
  16. return -1;
  17. }
  18. int mid = (left + right) / 2;
  19. int midVal = arr[mid];
  20. if (findVal > midVal) { // 向 右递归
  21. return binarySearch(arr, mid + 1, right, findVal);
  22. } else if (findVal < midVal) { // 向左递归
  23. return binarySearch(arr, left, mid - 1, findVal);
  24. } else {
  25. return mid;
  26. }
  27. }

发表评论

表情:
评论列表 (有 0 条评论,157人围观)

还没有评论,来说两句吧...

相关阅读