2010-09-30 56 views
0

谁能告诉我为什么我的程序工作怪异。我正在尝试按升序对list1进行排序。此代码是我正在编写的快速排序程序的一部分。按照我在这段代码中应用的逻辑,我也手动检查过,输出应该是[1,2,3,4,5]。但是输出结果是[1,2,2,4,5]。你能告诉出了什么问题吗?输出错误 - 按我的逻辑

list1=[3,2,1,5,4] 
n_list1=len(list1) 
count=0 

for position1, item1 in enumerate(list1[0:n_list1]): 
    temp=item1 
    count=count+1 
    for position2 in range(count,n_list1): 
     if list1[position1]>list1[position2]: 
      list1[position1]=list1[position2] 
      list1[position2]=temp 
      temp=list1[position1] 
print list1 

编辑:我所试图做的是这样的:

我开始的第一个元素具有以下(N-1)的元素比较,并与第一个交换的最小元素。现在我转到第二个元素,并将其与以下(n-2)个元素进行比较,并与这些(n-2)个元素中的最小元素进行交换。像这样我前进。

注意:这是我的quicksort程序的一部分,它本身不是quicksort。这部分是针对list1,我指定的数字小于枢轴。另一个代码将用于list2,我将分配大于数据透视的数字。

回答

2

由RBP提供的答案是绝对正确的!

另外,我想你可以简化由remove计数本身上面,也直接枚举列表,并使用Python成语 - A,B = B,A来交换值

list1=[3,2,1,6,5,4] 
n_list1 = len(list1) 
for position1, item1 in enumerate(list1): 
    for position2 in range(position1,n_list1): 
     if list1[position1]>list1[position2]: 
      list1[position1] , list1[position2] = list1[position2], list1[position1] 
print list1 

输出:

[1, 2, 3, 4, 5, 6] 

[编辑:关于成语]

>>> a = 4 
>>> b = 5 
>>> a , b = b, a 
>>> a 
5 
>>> b 
4 
>>> c = 5 
>>> d = 6 
>>> t = c 
>>> c = d 
>>> d = t 
>>> c 
6 
>>> d 
5 
>>> 
+0

@Harpreet:看到我编辑的答案 – pyfunc 2010-09-30 20:43:13

4

由于您在for的最前面做了count = count + 1,所以您永远无法到达list1(list1[0])的第一个位置,即元素“3”。

[编辑]你的代码看更仔细,似乎有很多混乱。例如,在

 list1[position1]=list1[position2] 
     list1[position2]=temp 
     temp=list1[position1] 

你失去list1的[位置1]:你用列表覆盖它[情况2],试图将其保存在临时变量之前。尝试将temp=list1[position1]移至if之后的第一行。

而且,说实话,你的实现是过于复杂。我建议你尝试用伪代码写它,试着真正理解发生了什么,然后重新实现它。

+0

这并不符合你的想法。正如我在编辑中提到的,你正在跳过太多的箍。看看Jon Bentley的实现,非常干净,应该让你更好地理解quicksort:http://www.youtube.com/watch?v = aMnn0Jq0J-E(如果你有权限的话,它也在“Beautiful Code”一书中) – rbp 2010-09-30 20:18:09

+0

另一个小点:enumerate(list1 [0:len(list1)])与enumerate(list1)基本相同。 。 – rbp 2010-09-30 20:18:54

+0

我想要做的是这样的:我开始比较第一个元素与下面的(n-1)个元素,并将第一个元素与最小的元素交换。现在我转到第二个元素,并将其与以下(n-2)个元素进行比较,并与这些(n-2)个元素中的最小元素进行交换。像这样我前进。 – Pupil 2010-09-30 20:23:53

0

小的改进,以pyfunc的正确答案... 此行

for position2 in range(position1,n_list1) 

可以

for position2 in range(position1+1,n_list1) 

,将节省您的时间。