2013-04-10 174 views
0

嘿,使代碼完美的作品非常感謝你!Python的冒泡排序

我只是有一個問題。 我想要在兩個coulmns之間顯示一個箭頭。我創建了這個代碼,但我真的不知道如何使它在正在切換的列之間移動。有什麼建議麼?

def arrow(lst, i):     # function for the arrow 
if (lst[i], lst[i+1] == lst[i+1], lst[i]): 
    t.home() 
    t.penup() 
        # im thinking something goes here but i dont know what :P 
    t.pendown() 
    t.pencolor("red") 
    t.right(90) 
    t.forward(20) 

任何幫助將不勝感激!謝謝! btw其餘的代碼就像imran的代碼! :) 謝謝!

+4

與您的問題無關,但是您的swapped變量有錯誤的意義(您在交換時將其設置爲false)。應該考慮扭轉一切使用。 – paxdiablo 2013-04-10 03:58:47

+1

你的「交換」的定義似乎與標準不同。 – 2013-04-10 04:00:37

+0

你的函數名稱不好。 – Sheng 2013-04-10 04:02:09

回答

0

你的代碼看起來很像冒泡排序here的版本之一。你的版本不工作的主要問題是因爲你正在索引i與i-1進行比較,當i = 0時失敗。改變部分:

 if (lst[i] < lst[i + 1]): 
      swapped = False 
      lst[i+1], lst[i] = lst[i], lst[i+1] 

另外,不要函數(理想情況下應該被稱爲bubble_sort,或類似的東西)之外定義N,即壞的編程,等待發生的錯誤。我不知道你在用lst = [lst]來完成什麼。可能要使用不同的變量名稱。

編輯: 我對你的代碼做了一些自由的改變。我把所有的繪圖調用放在了冒泡排序中。冒泡排序還會在內部將列表轉換爲元組的列表,其中元組的第二個元素是顏色。代碼末尾的for循環沒有做任何有價值的事情。我認爲你的主要問題是它不會在while循環的每次迭代之間暫停,所以你不會看到列表中的元素起泡。

#!/usr/bin/python 
import turtle as t 

def draw(lst, width): 
    for x in lst: 
    height = x[0] 
    t.color(x[1]) 
    t.forward(width) 
    t.left(90) 
    t.forward(height) 
    t.left(90) 
    t.forward(width) 
    t.left(90) 
    t.forward(height) 
    t.left(90) 
    t.penup() 
    t.forward(30) 
    t.pendown() 

def bubble_sort(orig_lst): 
    lst = [ (x, "blue") for x in orig_lst ] 
    n = len(lst)-1 
    t.pensize(3) 
    draw(lst, width) 
    swapped = True 
    while swapped: 
    swapped = False 
    for i in range(n): 
     if lst[i+1][0] < lst[i][0]: 
      lst[i], lst[i+1] = lst[i+1], lst[i] 
      lst[i] = (lst[i][0], "green") 
      swapped = True 
      next = raw_input("hit any key to continue ") 
      t.home() 
      t.clear() 
      draw(lst,width) 
    newLst = [ x[0] for x in lst ] 
    return newLst 

# TOP LEVEL 
original_lst = input("Enter list to be sorted: ") 
width = input("Provide the width: ") 

newLst = bubble_sort(original_lst) 
print "Done! Sorted list is: ", newLst 
next = raw_input("hit any key to exit ") 
+0

可以any1幫助我嗎? – SunShine 2013-04-12 02:07:24

+0

@SunShine看到我更新的答案 – imran 2013-04-12 04:05:38

+0

嗨,老兄非常感謝!此代碼是美好的:)作品不錯! – SunShine 2013-04-12 07:56:29

1

我寫了一個冒泡排序基於您的代碼:

import types 

def bubble_sort(lst): 
    assert(type(lst)==types.ListType) 
    for index in range(1,len(lst)): 
     while index > 0 and lst[index-1] > lst[index]: 
      lst[index-1] , lst[index] = lst[index] , lst[index-1] 
      index -= 1 
    return 

lst = input("Enter list to be sorted: ") 
print "Original: ",lst 
bubble_sort(lst) 
print "Sorted: ",lst 

測試看起來像:

C:\Users\NAME\Desktop>bubble.py 
Enter list to be sorted: [4, 24, 25, 2, 6, -1, 73, 1] 
Original: [4, 24, 25, 2, 6, -1, 73, 1] 
Sorted: [-1, 1, 2, 4, 6, 24, 25, 73] 

希望它能幫助!

1

有剛剛從原始的代碼編輯了一些東西,最好是有兩個for循環此檢查此值。同樣在你有[i-1]之前,如果這是有道理的,你將從左到右進行排序,從而破壞了氣泡排序的目的。無論如何,這是我所做的。

def swap(lst): 
    for i in range (len(lst)): 
     for j in range (len(lst)-1): 
      if lst[j] > lst[j+1]: 
       lst[j], lst[j+1] = lst[j+1], lst[j] 
       print (lst) 


lst = input("Enter list to be sorted: ") 
print (lst) 
swap(lst)