Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python实现快速排序,无法找出实现中的错误_Python_Quicksort - Fatal编程技术网

使用python实现快速排序,无法找出实现中的错误

使用python实现快速排序,无法找出实现中的错误,python,quicksort,Python,Quicksort,下面是我在python中实现快速排序的代码。但是,我无法找到我在实现中出错的地方。有线索吗 def quicksort(arr, size): partition(arr, size) def partition(arr, size): if size <= 1: return left = 0 right = size - 1 pivot = arr[size/2] while left < right:

下面是我在python中实现快速排序的代码。但是,我无法找到我在实现中出错的地方。有线索吗

def quicksort(arr, size):
    partition(arr, size)

def partition(arr, size):
    if size <= 1:
        return

    left = 0
    right = size - 1
    pivot = arr[size/2]

    while left < right:
        while arr[left] < pivot:
            left += 1
        while arr[right] > pivot:
            right -= 1

        temp = arr[left]
        arr[left] = arr[right]
        arr[right] = temp

    partition(arr, left)
    partition(arr[left:], len(arr[left:]))
arr = [1,2,3,4,5,45,3,5,4,6]  
quicksort(arr, len(arr))

您正在对新切片进行排序:

partition(arr[left:], len(arr[left:]))
这些切片是新列表,而不是原始列表对象。您对这些对象所做的任何操作都不会在arr的原始值中可见

如果要就地进行排序,则需要传递数组中要排序的部分的开始值和停止值,而不是传递切片:

def quicksort(arr):
    partition(arr, 0, len(arr) - 1)

def partition(arr, start, stop):
    if stop - start < 1:
        return

    left = start
    right = stop
    pivot = arr[start + ((stop - start) / 2)]

    while left <= right:
        while arr[left] < pivot:
            left += 1
        while arr[right] > pivot:
            right -= 1

        if left <= right:
            arr[left], arr[right] = arr[right], arr[left]
            left += 1
            right -= 1

    partition(arr, start, right)
    partition(arr, left, stop)
我还做了一些调整,调整了边界测试,并使用元组赋值来交换这两个元素

此版本正确排序:

>>> def quicksort(arr):
...     partition(arr, 0, len(arr) - 1)
... 
>>> def partition(arr, start, stop):
...     if stop - start < 1:
...         return
...     left = start
...     right = stop
...     pivot = arr[start + ((stop - start) / 2)]
...     while left <= right:
...         while arr[left] < pivot:
...             left += 1
...         while arr[right] > pivot:
...             right -= 1
...         if left <= right:
...             arr[left], arr[right] = arr[right], arr[left]
...             left += 1
...             right -= 1
...     partition(arr, start, right)
...     partition(arr, left, stop)
... 
>>> arr = [1,2,3,4,5,45,3,5,4,6]  
>>> quicksort(arr)
>>> arr
[1, 2, 3, 3, 4, 4, 5, 5, 6, 45]

发布问题时,请描述您看到的问题-代码是否引发运行时错误?它是否运行了,但产生了意外的结果?实现似乎存在一些问题。运行代码后,我没有得到排序列表。