2015-08-30 91 views
0

給定一個列表x,我想用選擇排序對它進行排序,然後計算在排序內進行的交換次數。所以我出來這樣的事情:簡單選擇重複元素排序?

count=0 
a=0 
n=len(x) 
while (n-a)>0: 
    #please recommend a better way to swap. 
    i = (min(x[a:n])) 
    x[i], x[a] = x[a], x[i] 
    a += 1 
    #the count must still be there 
    count+=1 
print (x) 

你能幫我找到一種方法來更好地管理這個嗎?它不能很好地工作。

+2

是有沒有原因你不使用'x.sort()'? – kmacinnis

+0

我實際上計劃添加一個「計數」功能,它將跟蹤列表中兩個數字交換的次數。所以我必須手動執行此操作。 – txsaw1

+0

計數已經確定,所以不用擔心。 – txsaw1

回答

3

問題不在於重複的元素。您的代碼不適用於所有元素不同的列表。嘗試x = [2,6,4,5]

i = (min(x[a:n])) 

min()這裏得到切片的最小元素的,然後你使用它作爲一個指數,那沒有意義。

+0

感謝您的澄清,我現在得到了不同。 – txsaw1

1

您正在混淆元素的值與其位置。您必須使用索引來確定位置。

seq = [2,1,0,0] 
beg = 0 
n = len(seq) 

while (n - beg) > 0: 
    jdx = seq[beg:n].index((min(seq[beg:n])))   # use the remaining unsorted right 
    seq[jdx + beg], seq[beg] = seq[beg], seq[jdx + beg] # swap the minimum with the first unsorted element. 
    beg += 1 

    print(seq) 

print('-->', seq) 
  • 作爲分選進行,列表左側[0:BEG]進行排序,並且右側[BEG:]被排序,直到完成。
  • JDX是最小列表的剩餘的位置(索引)(發現最小必須發生在列表的未分選的右部 - > [求:])
+1

感謝您的幫助。它現在有效。可能其中一個變化是將索引列表替換爲我們的索引,我們只選擇沒有排序元素的部分。 – txsaw1