使用二进制搜索在列表中查找项目的位置

时间:2016-11-20 06:50:19

标签: string list recursion mergesort

问题是:

  

给定一个String列表,在列表中找到一个特定的字符串并返回   它的索引在按顺序排序的String的有序列表中。有   两种情况:

     
      
  1. 字符串在列表中,在有序列表中返回它应该包含的索引。

  2.   
  3. String不在列表中,在有序列表中返回它应该包含的索引。

  4.   

这是我的代码,我假设已经订购了给定的列表。

对于第二种情况,如何使用mergesort查找假设的索引?我会很感激一些线索。

我正在考虑先获取原始列表的副本,对其进行排序,然后在副本列表中获取字符串的索引。在这里我卡住了...我是否再次使用mergesort来获取副本列表中不存在的字符串的索引?

public static int BSearch(List<String> s, String a) {

    int size = s.size();
    int half = size / 2;
    int index = 0;
    // base case?

    if (half == 0) {

        if (s.get(half) == a) {
            return index;
        } else {
            return index + 1;
        }
    }

    // with String a
    if (s.contains(a)) {
        // on the right
        if (s.indexOf(s) > half) {
            List<String> rightHalf = s.subList(half + 1, size);
            index += half;
            return BSearch(rightHalf, a);

        } else {
            // one the left
            List<String> leftHalf = s.subList(0, half - 1);
            index += half;
            return BSearch(leftHalf, a);
        }
    }
    return index;

}

运行此代码时,索引不会更新。我想知道这里有什么问题。当我测试代码时,即使列表中包含字符串,我也只会得到01

1 个答案:

答案 0 :(得分:2)

您的代码仅返回01,因为您没有跟踪每个递归调用的索引,而不是每次都重置为0。另外,要查找不存在的元素的位置,请考虑列表{0,2,3,5,6}。如果我们在这里运行二进制搜索以查找4,它应该停在元素5所在的索引处。希望这足以让你开始!