2016-04-27 159 views
0

我想使用插入排序來對輸入文件中的數據進行排序,但代碼似乎不起作用!我過於複雜嗎?任何幫助將不勝感激!使用插入排序對輸入數據進行排序

input_file = open('C:\\Users\\Desktop\\data.txt', 'r') 
for line in input_file: 
    print line 

def insertion_sort(items): 
    for i in range (1, len(items)): 
     j=i 
     while j>0 and items[j]<items [j-1]: 
      temp = items[j] 
      items [j]=items[j-1] 
      items [j-1]=temp 
      j=j-1 

insertion_sort(input_file) 
print 'After sorting:', input_file 

input_file.close() 
+2

你是什麼意思的「它不工作」?它在什麼樣的輸入上輸出了什麼? –

+0

你可以用硬編碼輸入替換輸入文件,以便我們可以測試行爲嗎? – Stefano

+0

這不是插入排序。看起來更像是某種泡沫排序。 –

回答

3

什麼要傳遞到insertion_sort文件對象。它看起來好像你的insertion_sort函數期望的東西更像是一個列表其內容可以混亂。

一個文件對象是「可迭代的」,它(除其他外)意味着您可以從其內容中創建一個列表:list(input_file)將是一個列表,文件中每行包含一個元素。但請注意,遍歷行 - 如你在開始時所做的那樣 - 移過它們,打印完所有行list(input_file)後將成爲一個空列表。所以如果你想從文件中創建一個列表,你應該在打開文件後立即執行。

更改列表不會改變文件的內容。如果你想這樣做,你需要重新寫出來。

0

通過查看您的代碼,我猜測它在排序列表中沒有輸出任何內容,原因很簡單,您已經耗盡了生成器從文件中返回行以未排序的順序進行打印。

將行存儲在列表中並遍歷它以打印它,然後您仍可以稍後重新使用列表進行處理。

input_file = open('C:\\Users\\Desktop\\data.txt', 'r') 
input_lines = input_file.readlines() 

for line in input_lines: 
    print line 

insertion_sort(input_lines) 
0

你可以嘗試這樣的事情:

#use 'with' statement so context manager will handle possible exceptions and close file 
with open('C:\\Users\\Desktop\\data.txt', 'r'): 
    def insertion_sort(sort_list): 
     for i in range(0, len(sort_list)): 
      j = i 
      while j > 0 and sort_list[j - 1] < sort_list[j]: 
       #some sugar to avoid temp variable 
       sort_list[j - 1], sort_list[j] = sort_list[j], sort_list[j - 1] 
       j = j - 1 

    #make a list of file iterator 
    list_to_sort = list(input_file) 
    print 'Before:', list_to_sort 
    insertion_sort(list_to_sort) 
    print 'After:', list_to_sort 

正如在答覆中提到,當你打開文件,你得到一個迭代器上面。如果你想要一個可以玩的對象(修改它的內容),這當然是你可以製作這個迭代器的列表。而當你打開你的文件在只讀模式下,你不能在那裏寫我們的功能的結果。如果你需要把結果寫回你的文件,你應該在'r +'模式下打開它,因爲'r'是隻讀的。