2015-09-16 64 views
0

我想製作一個二進制搜索算法,但我無法使其工作。它最終達到目標數量,但不會將其計算爲與目標數量相等。 I.E.如果78是目標數量最終陣列[中點]不等於78,但我的if語句不這樣認爲它會看到它作爲多於或少於78Python二進制搜索項目將不會等於目標

[3, 30, 33, 38, 57, 61, 70, 89, 93, 98] 
Enter a number to search for.93 
5 
61 
more 
8 
93 
more 
9 
98 
more 
10 

這是一個測試的結果。我只是爲了知道它在做什麼而將它打印出來。它打印的第一個數字是中點,第二個數字是該點陣列中的項目。

達到10後,我得到一個索引超出範圍的錯誤。

這是我的代碼。

def BinarySearch(array): 
    found = False 
    startpos = 0 
    endpos = len(array) 
    mid = 0 
    target = raw_input("Enter a number to search for.") 

    while found == False or startpos <= endpos: 
     mid = (startpos + endpos)/2 


     if array[mid] == target: 
      print "Found" 
      found = True 
      return found 
     elif array[mid] < target: 
      startpos = mid + 1 

     else : 
      endpos = mid - 1 


    return found 
+0

'93 == 「93」''回報FALSE'。 –

+0

我想這是一個很好的學習練習,但有一個標準的Python [bisect](https://docs.python.org/2/library/bisect.html)模塊。順便說一句,在程序的外部獲取用戶輸入是更好的設計,然後將輸入(經過轉換並可能驗證之後)傳遞給執行實際工作的內部函數。對於像這樣的小程序來說沒關係,但是在大型程序中它會變得非常混亂。 –

+0

我在初始版本中已經有了這個功能,但是它並沒有接近正常工作,僞代碼就是這樣做的,所以我決定遵循它。 –

回答

1

target是一個字符串。您需要將其轉換爲整數。 target = int(target)

1
  • endpos初始值應該是len(array) - 1,作爲陣列的索引從0
  • 開始與and替換or,因爲這兩個條件中的任意一個可以終止while循環。
  • 轉換targetint,即target = int(target)
+1

爲什麼要考慮將'或'改成''和''返回找到'會不會破壞循環呢?最好擺脫它,只使用'while startpos <= endpos','在循環內返回True'並在末尾使用'返回False'。 –

+0

@Mathias Ettinger,是的。我只是糾正了作者原來的錯誤。不優化算法 – Hooting

+0

這不是關於優化,而是關於代碼的質量(以及因此答案的質量)。優化將'def search(array):target = int(raw_input(「輸入要搜索的數字」));返回數組中的目標' –