2013-10-08 60 views
1

所以我開發了一個快速選擇函數的代碼,但它似乎沒有打印出中位數。 我有一個文件名的主要功能提示,然後導入txt文件,把它分解成數字的列表,這是txt文件:Python-Quickselect函數查找中位數

Offices 70 
MedicalOffice 120 
PostOffice 170 
Mall 200 

它被導入到一個列表:

L = ['70', '120', '170', '200'] 

當它通過quickselect函數運行時,它會打印出經過的時間是每次類似1.9083486328125e-06之類的變化的奇數...首先關閉什麼值的時間是以毫秒爲單位的?當功能運行並返回它的樞軸吐出來:

>>> main() 
Enter a filename: Input.txt 
['70', '120', '170', '200'] 
Time: 1.9073486328125e-06 
200 

有人可以告訴我爲什麼它不工作?這是代碼:

import time 

start_time = 0 

def quickSelect(L, k): 
    start_time = time.time() 
    if len(L) != 0: 
     pivot = L[(len(L)//2)] 
     smallerList = [] 
    for i in L: 
     if i<pivot: 
      smallerList.append(i) 
    largerList=[] 
    for i in L: 
     if i>pivot: 
      largerList.append(i) 
    m=len(smallerList) 
    count=len(L)-len(smallerList)-len(largerList) 
    if k >= m and k < m + count: 
     end_time = time.time() 
     print("Time: ", end_time - start_time) 
     return pivot 
    elif m > k: 
     return quickSelect(smallerList, k) 
    else: 
     return quickSelect(largerList, k - m - count) 
def main(): 

    dataFilename = input('Enter a filename: ') 

    dataFile = open(dataFilename) 
    L = [] 
    for inputLine in dataFile: 
     splittext = inputLine.split() 
     place = splittext[0] 
     locations = splittext[1] 
     L += [locations] 
    print(L) 
    print(quickSelect(L, len(L)//2)) 
+0

看看結果'排序(L)'如果你想找出爲什麼''200''是中值:-) – WolframH

回答

1

time()方法,因爲時代作爲浮點返回經過秒。爲了打印從特定開始時間以秒爲單位的經過時間,您需要設置您的start_time = time.time()。然後,您可以採用time.time() - start_time的差異以秒爲單位獲取已用時間。

至於爲什麼你的函數沒有輸出中位數,我首先要確保你傳遞一個整數列表quickSelect。現在,看起來您正在傳遞一個字符串列表,因此您在quickSelect中的比較是在字符串對之間進行的,而不是整數。嘗試使用

L.append(int(locations)) 
+0

好了感謝,但你知道我爲什麼代碼不選擇中位數? – user123456789101112

+0

我認爲你需要將你的數據轉換爲整數。看到我上面更新的答案。 – mdml

+0

非常感謝您的幫助我是編程新手,它的驚人之處在於最小的東西如何改變一切 – user123456789101112