2017-10-08 54 views
0

我需要排序此列表而不使用內置排序()。 我想我可以使用插入排序,但我從來沒有真正使用它。 我的代碼似乎沒有工作。它有什麼問題? 謝謝。python,插入排序,字符串

fruits = ['grape', 'banana', 'strawberry', 'apple', 'peach', 'cherry'] 



for i in range(1, len(fruits)): 
    tmp = fruits[i] 
    j = i-1; 
    while (j>0 and fruits[j] > tmp): 
     fruits[j+1] = fruits[j] 
     j = j-1 
     fruits[j+1] = tmp 
print(fruits) 
+1

你實際上是否在任何地方調用'insertion_sort'?如果你這樣做了,你會得到一個NameError,因爲'lens'沒有被定義。 –

+0

另外 - 如果你剛剛開始 - 不要養成用''結尾的習慣 - - 它們不是必需的... –

+0

我遵循了你的建議。謝謝!仍然試圖找出什麼是錯的 – Lexi

回答

0

我改變了兩件事,它的工作原理。不完全是作爲答案,但可能會幫助你前進。

fruits = ['grape', 'banana', 'strawberry', 'apple', 'peach', 'cherry'] 

for i in range(0, len(fruits)): 
    tmp = fruits[i] 
    j = i-1; 
    print(fruits) 
    while (j>-1 and fruits[j] > tmp): 
     fruits[j+1] = fruits[j] 
     j = j-1 
     fruits[j+1] = tmp 

print(fruits) 

可以做得更小這樣:

fruits = ['grape', 'banana', 'strawberry', 'apple', 'peach', 'cherry'] 

for i in range(len(fruits)): 

    tmp = fruits[i] 
    j = i-1 # stop index 
    while (j > -1 and fruits[j] > tmp): 
     fruits[j:j+2] = tmp,fruits[j] #swap places 
     j -= 1 

print(fruits) 

返回:

['apple', 'banana', 'cherry', 'grape', 'peach', 'strawberry'] 
+0

這很有道理!感謝您的幫助 – Lexi

0

出現在內環交換操作似乎很奇怪。如果我是一個投注人,我會說這是錯誤發生的地方。

試着做一個乾淨的 「交換」,就像你對三個變量做到這一點:

a = 10 
b = 20 
tmp = a 
a = b 
b = tmp 
print(a) # prints 20 
print(b) # prints 10 

您的代碼將成爲類似:

for i in range(1, len(fruits)): 
    j = i-1 
    while j >= 0 and fruits[j] > fruits[j+1]: 
     # Swap the two consecutive elements which are unsorted 
     tmp = fruits[j] 
     fruits[j] = fruits[j+1] 
     fruits[j+1] = tmp 
     # Prepare to process previous two consecutive elements 
     j = j-1 
+0

它是有道理的!謝謝你的幫助! – Lexi

0

首先更換鏡頭()由LEN ()。

另一方面,你不能在水果數組上應用你的函數,你只需聲明函數。

最後,陣列在索引0處開始,所以Ĵ必須> = 0。

更正代碼:

fruits = ['grape', 'banana', 'strawberry', 'apple', 'peach', 'cherry'] 

def insertion_sort(fruits): 

    for i in range(1, len(fruits)): 
     tmp = fruits[i] 
     j = i-1; 
     while (j>=0 and fruits[j] > tmp): 
      fruits[j+1] = fruits[j]; 
      j = j-1; 
     fruits[j+1] = tmp; 
    return fruits 

if __name__ == "__main__": 

    fruits2 = insertion_sort(fruits) 
    print(fruits2) 
+0

謝謝!我理解第一部分,但是如果__name__ p ==「__main__」部分做什麼, 是什麼? – Lexi

+0

如果__name__ ==「__main__」用於執行.py如何「主程序」 – Suaro

0
fruits = ['grape', 'banana', 'strawberry', 'apple', 'peach', 'cherry'] 
for i in range(1,len(fruits)) 
temp=fruits[i] 
k = i 
    while k > 0 and tmp < fruits[k - 1]: 
     fruits[k] = fruits[k - 1] 
     k -= 1 
    fruits[k] = tmp 
print fruits 

您的循環將執行一個時間少爲 J =異1 j> 0 它應該是 j> -1

+0

我現在明白了。感謝您的幫助! – Lexi