2016-04-03 132 views
1

我想排序從第二個數字開始的數組,並查看它之前的數組,看看前面的數字是否更大。如果是這樣,我想交換數字,否則將數字保持在原來的位置。目前我的代碼沒有這樣做。當我輸入下面的數組時,唯一變化的是2變成11,給我兩個11在中間。出了什麼問題?蟒蛇交換排序沒有給出正確的輸出

#given an array of digits a of length N 
a = [7, 3, 11, 2, 6, 16] 
N = len(a) 

# moving forward along a starting from the second position to the end 

# define _sillysort(a, start_pos): 
#  set position = start_pos 
#  moving backwards along a from start_pos: 
#   if the a[position-1] is greater than a[position]: 
#    swap a[position-1] and a[position] 
def sillysort(a, start_pos): 
    a_sorted = [] 
    start_pos = a[1] 
    for position in a: 
     if a[start_pos-1] >= a[start_pos]: 
      a[start_pos-1], a[start_pos] = a[start_pos], a[start_pos-1] 
     else: 
      a[start_pos-1] = a[start_pos] 
     a_sorted.append(position) 
     position += 1 
    return a_sorted 

當運行此,sillysort(一,N),I得到這個輸出[7,3,11,11,6,16]。

回答

0

代碼有幾個問題

start_pos = a[1]

如果您已經提供START_POS作爲參數傳遞給你的函數,你爲什麼在函數重新初始化它。此外,如果a是要排序的數組,那麼爲什麼您的算法的start_pos是數組a本身的第二個元素?

for position in a: 
     if a[start_pos-1] >= a[start_pos]: 
      a[start_pos-1], a[start_pos] = a[start_pos], a[start_pos-1] 
     else: 
      a[start_pos-1] = a[start_pos] 
     a_sorted.append(position) 
     position += 1 

for in循環將遍歷陣列aposition將採取數組的元素的值。在您的例子position將採取以下順序值:

7, 3, 11, 2, 6, 16

我不會在的的結束for循環明白的是你爲什麼要遞增位置1。再次,您正在使用數組內的值來索引數組而不是索引本身。由於在你的例子中,start_pos將採用值a[1]即3,你的代碼比較一個[3]和一個[2]即2和11,並進入else條件,並使[3] = a [2 ],所以你得到11的位置2

你可能已經弄糊塗了變量名稱。看看這是否有助於你。