2013-04-14 73 views
1

剛剛遺失了缺少的信息!python函數排序交替磁盤

我需要一些幫助與我的任務在這裏,這是基本的python編程,但我實施該功能時卡住了。希望可以有人幫幫我!!在此先感謝^^

任務: 首先,我需要建立一個數組,A 2n交替'1'和'0'。即101010 然後,我需要按照所有0的順序對它們進行排序,然後全1。即000111

要做到這一點,我需要構建一個函數Arrange_Disks(A,n)來接收數組A和n以及在完成2n個磁盤的必要移動後返回數組。主要功能應該顯示排列前後的數組以及執行排列所需的移動次數。在2範圍內使用n值至10

下面是我迄今所做的功能:

A=[] 

def Arrange_Disks(A,n): 

    moves=0 
    for i in xrange(n): 
     minn=i 
     for j in xrange(i+1,n): 
      if A[j]<A[minn]: 
       minn=j 
     moves+=minn-i  
     A[i],A[minn]=A[minn],A[i] 
    return A 
    return moves 


def main(): 

    n=input("Please enter a number between 2 to 10: ") 

    for disk in range (1,(2*n+1)): 
     if (disk%2) != 0: 
      A.append("1") 
     else: 
      A.append("0") 
    print "This is the original array: ", A 

    Arrange_Disks(A,n) 

    print "This is the sorted array: ", A 
    print "This is the number of moves required: ", moves 

main() 

不知怎的,當我運行這段代碼,那隻能說明,直到這裏:

>Please enter a number between 2 to 10: 3 
>This is the original array: ['1', '0', '1', '0', '1', '0'] 
>This is the sorted array: ['0', '1', '1', '0', '1', '0'] 
>This is the number of moves required: 0 

和輸出並不反映的移動次數...

所以我想知道如果有人能賜教我的代碼。我知道這是一個很長的問題,非常感謝您閱讀並花時間回答我的問題!

PS我做了一個冒泡排序的方式對這個問題 ,我使用python 2.7

許多再次感謝^^

+1

只是一個小點,你可以有多個'return' stat在方法中表達但是你寫你的方式,第一個將退出該方法,第二個將永遠不會運行。 –

回答

0

如果我明白你的問題正確的話,我想你可以使用Selection Sort這裏:

def selection_sort(A,n): 
    moves=0 
    for i in xrange(n): 
     minn=i 
     for j in xrange(i+1,n): 
      if A[j]<A[minn]: 
       minn=j 
     moves+=minn-i  
     A[i],A[minn]=A[minn],A[i] 
    print moves,A 

#examples: 
selection_sort(['1', '0', '1', '0', '1', '0'],6) 
selection_sort(['1', '0', '1', '1', '1', '1'],6) 

輸出:

6 ['0', '0', '0', '1', '1', '1'] 
1 ['0', '1', '1', '1', '1', '1'] 

而產生的交變10列表您可以使用itertools.cycle

>>> from itertools import cycle 
>>> c=cycle(('1','0')) 
>>> n=3 
>>> [next(c) for _ in xrange(n*2)] 
['1', '0', '1', '0', '1', '0'] 

工作代碼的版本:

def Arrange_Disks(A): 
    length=len(A) 
    moves=0 
    for i in xrange(length): 
     minn=i 
     for j in xrange(i+1,length): 
      if A[j]<A[minn]: 
       minn=j 
     moves+=minn-i  
     A[i],A[minn]=A[minn],A[i] 
    return A,moves    #returns a tuple containing both A and moves 


def main(): 

    n=input("Please enter a number between 2 to 10: ") 
    A=[] 
    for disk in range (1,(2*n+1)): 
     if (disk%2) != 0: 
      A.append("1") 
     else: 
      A.append("0") 
    print "This is the original array: ", A 

    A,moves=Arrange_Disks(A) 

    print "This is the sorted array: ", A 
    print "This is the number of moves required: ", moves 

main() 

輸出:

Please enter a number between 2 to 10: 3 
This is the original array: ['1', '0', '1', '0', '1', '0'] 
This is the sorted array: ['0', '0', '0', '1', '1', '1'] 
This is the number of moves required: 6 

Please enter a number between 2 to 10: 5 
This is the original array: ['1', '0', '1', '0', '1', '0', '1', '0', '1', '0'] 
This is the sorted array: ['0', '0', '0', '0', '0', '1', '1', '1', '1', '1'] 
This is the number of moves required: 15 
+0

我很抱歉,我的遺失信息!然而,選擇排序出現了一個非常奇怪的輸出,如['0','1','1','0','1','0'] ...但非常感謝您的幫助! – Lavinia

+0

@Lavinia問題在於你傳遞了錯誤的'n'值,傳遞給'Arrange_Disks'的'n'必須等於列表長度(即n * 2)。 我在我的解決方案中添加了代碼的工作版本。 –

+0

非常感謝您的幫助!我非常感謝它!但我仍然沒有真正理解傳遞n值的邏輯......就像我認爲n只是用戶請求的價值一樣?它爲什麼最終與數組的長度有關?並再次感謝對我的問題如此耐心! – Lavinia