2015-08-30 60 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