【问题标题】:Wrong output in Python - as per my logicPython中的错误输出 - 根据我的逻辑
【发布时间】:2010-09-30 20:03:13
【问题描述】:

谁能告诉我为什么我的程序运行异常。我正在尝试按升序对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) 个元素中的最小元素进行交换。就这样我往前走。

注意:这是我的快速排序程序的一部分,它本身不是快速排序。这部分适用于list1,我为其分配的数字小于枢轴。另一个代码是list2,我将分配大于枢轴的数字。

【问题讨论】:

    标签: python list quicksort


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这并不像你想象的那样。正如我在编辑中提到的那样,你跳过了太多的圈子。看看 Jon Bentley 的实现,它非常简洁,应该让你更好地理解快速排序:youtube.com/watch?v=aMnn0Jq0J-E(如果你可以访问它,它也在“Beautiful Code”一书中)
    • 另一个小问题:enumerate(list1[0:len(list1)]) 和 enumerate(list1) 基本上是一回事。
    • 我想做的是这样的:我开始将第一个元素与以下 (n-1) 个元素进行比较,并将最小的元素与第一个元素交换。现在我转到第二个元素并将其与以下 (n-2) 个元素进行比较,并与这些 (n-2) 个元素中的最小元素进行交换。就这样我往前走。
    • 这是(有点)冒泡排序,不是快速排序!
    • 嗯,这将是一个非常奇怪的快速排序。在快速排序中,您不需要显式地排序每个子列表。只需将小于枢轴的数字扔到一侧,大于枢轴到另一侧,然后在每一侧递归调用快速排序。正如我之前所说,你只是让自己对一个非常迂回的实现感到困惑。我建议您从新开始,使用伪代码(并阅读有关快速排序的更多信息)。另外,看看我(和菲利普)建议的改变。
    【解决方案2】:

    rbp提供的答案绝对正确!

    另外,我想您可以通过删除 count 本身来简化上述操作,也可以直接枚举列表并使用 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
    >>> 
    

    【讨论】:

      【解决方案3】:

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

      for position2 in range(position1,n_list1) 
      

      可以

      for position2 in range(position1+1,n_list1)
      

      会为您节省一点时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        相关资源
        最近更新 更多