2016-11-20 174 views
0

問題查找列表項的位置是:使用二進制搜索

給定的字符串列表,在列表中找到一個特定的字符串,並通過歸併排序字符串的有序列表返回 其索引。有 兩種情況:

  1. 的字符串列表,返回它應該是在索引,排序列表。

  2. 該字符串不在列表中,返回它應該在有序列表中的索引。

這裏是我的我的代碼,我假設給定的列表已經下令。

對於第二種情況,我如何使用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

+0

這行'if(s.contains(a))'有點違背了做二分查找的目的...... – smac89

+0

因爲在這個問題中有兩種情況,我正在考慮在列表中有第一個字符串,然後考慮字符串不在列表中 – max

+0

如果你正確地執行了二分查找,你只需要一個代碼來確定字符串將在哪裏處理 – smac89

回答

2

您的代碼只返回01,因爲您不會每次遞歸調用都跟蹤索引,而不是每次重置爲0。此外,要找到不存在的元素應該在哪裏,請考慮列表{0,2,3,5,6}。如果我們要在這裏運行二分法搜索以查找4,則應該停止在元素5所在的索引處。希望這足以讓你開始!

+0

我處理字符串。從a-z。我明白你的意思, – max