繁体   English   中英

在ArrayList上进行递归二进制搜索

[英]Recursive binary search on ArrayList

我正在尝试对ArrayList进行递归 二进制搜索 ,但不确定我的代码有什么问题。 我有一个带有一堆整数的文本文件,看起来像这样:

217320550212 12 17 3560 2999 211

问题是,当我输入数字以搜索ArrayList时,总是说该元素不存在,但我知道确实存在!

        public static int binarySearch(List<Integer> arr, Integer l, Integer r, Integer x)
        {
            if (r>=l)
            {
                Integer mid = l + (r - l)/2;

                // If the element is present at the middle itself
                if ((arr.size()/2) == x)
                    return mid;

                // If element is smaller than mid, then it can only
                // be present in left subarray
                if ((arr.size()/2) > x)
                    return binarySearch(arr, l, mid-1, x);

                // Else the element can only be present in right
                // subarray
                return binarySearch(arr, mid+1, r, x);
            }
            // We reach here when element is not present in array
            return -1;
        }   
    }

任何帮助将不胜感激,这里是新程序员!

您检查元素是否存在的部分是错误的,请不要这样做:

arr.size()/2 == x
arr.size()/2 > x

相反,请执行以下操作:

arr.get(mid) == x
arr.get(mid) > x

因为您应该在mid位置访问元素,所以不要检查列表大小的一半是否等于x

您不应该用arr[mid]或类似的东西替换arr.size()吗? 看起来您不是在比较项目的值,而是在比较数组大小本身,它是恒定的,完全不相关。

您计算mid ,然后使用arr.size() / 2 ,而不是...

arr.get(mid)替换它们,如下所示:

public static int binarySearch(final List<Integer> arr, final int l, final int r, final Integer x)
{
   if (r >= l)
   {
      final int mid = l + (r - l) / 2;

      // If the element is present at the middle itself
      if (x.equals(arr.get(mid)))
         return mid;

      // If element is smaller than mid, then it can only
      // be present in left subarray
      if (arr.get(mid) > x)
         return binarySearch(arr, l, mid - 1, x);

      // Else the element can only be present in right
      // subarray
      return binarySearch(arr, mid + 1, r, x);
   }
   // We reach here when element is not present in array
   return -1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM