【问题标题】:QuickSort which correctly orders an array, but doesn't return it ordered正确排序数组但不返回有序数组的快速排序
【发布时间】:2017-11-06 14:32:21
【问题描述】:

我正在 Python 中实现快速排序,我对此没有什么问题。 我的函数以递归方式完美运行,但它不会返回有序数组,而只返回原始数组。

在我的代码中,我有两个版本的快速排序。 quickSort_2 工作正常并对列表进行排序。取而代之的是 quickSort_1 的工作原理与 quicksort_1 完全相同,但会返回原始数组。

知道为什么会这样吗?

import random
import list

def partition(A,p):
    pivot=A[p]
    sup=0
    inf=len(A)-1
    while sup!=inf:
        while A[sup]<pivot:
            sup+=1
        while A[inf]>pivot:
            inf-=1
        list.swap(inf,sup,A) #swap
        print A
    return sup

def quickSort_1(A):
    if len(A)<=1:
        return A
    r=random.choice(range(0,len(A)-1))
    print A
    m=partition(A,r)
    return quickSort_1(A[:m+1])+quickSort_2(A[m+1:])

def quickSort_2(A):
    if len(A)<=1:
        return A
    r=random.choice(range(0,len(A)-1))
    print A
    m=partition(A,r)
    quickSort_1(A[:m+1])
    quickSort_2(A[m+1:])
    return A

【问题讨论】:

  • 请检查最后一段好吗?我认为您以错误的方式使用了一些方法:P。哪个运行良好,哪个返回状态不佳?无论如何,我认为第二个版本有问题。原因是您正在为数组的每个部分计算 quickSort 但返回原始部分 A.尝试附加两个调用的结果并返回。

标签: python sorting recursion quicksort


【解决方案1】:

您将在第二个函数中返回原始数组 A

你应该做的是将排序后的数组保存为你的原始数组和return这个值。像这样的:

A_new = quickSort_1(A[:m+1])+quickSort_2(A[m+1:])
return A_new

由于您要在函数quickSort_1quickSort_2 的范围内更改数组A,因此不会更改原始数组A

【讨论】:

  • 谢谢,我对我朋友基于 quicksort_2 方法创建的另一个版本的快速排序感到困惑。不同之处在于,在他对两个子列表调用快速排序之后,他在索引上使用了 if 条件,而最后(当快速排序对整个列表进行排序时)他在 A 上使用 return。
  • 没问题。如果它解决了您的问题,请考虑将答案标记为已接受以关闭问题。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 2020-12-20
  • 2019-11-23
相关资源
最近更新 更多