有人可以告诉我为什么我的程序工作很奇怪。我试图按升序排序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
,其中我将指定大于数字的数字。
答案 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)
并且会节省你一点时间。