JAVA - 二进制搜索 - 返回键的索引

时间:2011-04-25 19:41:57

标签: java recursion binary-search

我有以下需要解决的问题,但是有点尴尬。如果有人可以提供帮助,我将非常感激。

简而言之,可以归结为以下几点:

  1. 如果搜索键在数组中 - 它返回a [i]等于键的最小索引i
  2. 如果搜索键不在数组中但更大 - 它返回最小索引i为-i,其中[i]大于键
  3. 如果搜索键不在数组中但更小 - 它返回-j,其中j是数组中最后一个元素的索引
  4. 我有搜索密钥的代码,但我不知道如何返回上面提到的索引......

    import java.util.Arrays; 
    public class BinarySearchIndex2 {
    
        // a working recursive version
        public static int search(String key, String[] a) {
            return search(key, a, 0, a.length);
        }
    
        public static int search(String key, String[] a, int lo, int hi) {
            // possible key indices in [lo, hi)
            if (hi <= lo) return -1;
    
            int mid = lo + (hi - lo) / 2;
            int cmp = a[mid].compareTo(key);
            if      (cmp > 0) return search(key, a, lo, mid);
            else if (cmp < 0) return search(key, a, mid+1, hi);
            else              return mid;
        }
    
        public static void main(String[] args) {
    
            String key = args[0];
            int sizeoflist = StdIn.readInt();
            String[] a = new String[sizeoflist];
                int counter = 0; //counter for while loop to fill array a
    
            while (!StdIn.isEmpty()){
    
                a[counter] = StdIn.readString();
                counter++;
    
            }
    
            Arrays.sort(a); // sort the words (if needed)
    
            if ( search(key, a) < 0) ; /* System.out.println();*/
            else if ( search(key, a) > 0 ) ;
            else if ( search(key, a) = 0 ) ;
    
        }
    }
    

    如果有人可以帮我解决这个问题会很高兴......

    谢谢!

2 个答案:

答案 0 :(得分:1)

重点在于:

    if (hi <= lo) return -1;

当你有一个子数组来搜索大小为零时会发生这种情况,这意味着该元素不存在。现在想一想:规范对这里的返回值有什么看法?

答案 1 :(得分:1)

String.compareTo执行字典比较。这意味着它可以决定“50”>“100”,而显然50 <100是您所期望的。这将影响您的Arrays.sort调用,因此您的数组已经搞砸了。

是否必须将public static int search(String key, String[] a)作为您的API?

如果您可以将其更改为public static int search(int key, int[] a),那么它将使您的API正常工作(假设您没有我错过的任何错误)。

希望这就是你所指的。

编辑:对问题分析进行了一些精细调整。