Python中的错误输出 - 根据我的逻辑

时间:2010-09-30 20:03:14

标签: python list quicksort

有人可以告诉我为什么我的程序工作很奇怪。我试图按升序排序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)个元素进行比较,并将最小的元素与第一个元素交换。现在我转到第2个元素并将其与以下(n-2)个元素进行比较,并与这些(n-2)元素中的最小元素交换。像这样我向前迈进。

注意:这是我的快速排序程序的一部分,它本身并不是快速排序。这部分适用于list1,我指定的数字少于数据。另一个代码将用于list2,其中我将指定大于数字的数字。

3 个答案:

答案 0 :(得分:4)

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

[编辑]仔细查看您的代码,似乎有很多困惑。例如,

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

你正在丢失list1 [position1]:在尝试将它保存在temp变量之前,你用list [position2]覆盖它。尝试将temp=list1[position1]移到if之后的第一行。

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

答案 1 :(得分:2)

rbp提供的答案绝对正确!

另外,我猜你可以通过删除计数本身简化上面的内容,也可以直接枚举列表并使用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
>>> 

答案 2 :(得分:0)

对pyfunc正确答案的一点改进...... 这一行

for position2 in range(position1,n_list1) 

可以

for position2 in range(position1+1,n_list1)

并且会节省你一点时间。