尝试编写一个Quicksort的就地实现,但我无法返回已排序的数组

问题描述

我尝试编写就地快速排序,但无法正确返回排序后的数组。根据print语句的输出,该算法似乎确实在对数组进行排序,但我似乎无法返回已排序的数组。我以为会进行排序,但似乎没有,而且我不确定如何解决此问题。

def quicksort(array):

    if len(array) <= 1:
        return 

    pivot = len(array) - 1
    i = 0

    while i < pivot:
        if array[i] > array[pivot]:
            if i == pivot - 1:
                array[i],array[pivot] = array[pivot],array[i]
            
            array[pivot],array[pivot-1] = array[pivot-1],array[pivot]
            pivot -= 1
            array[i],array[pivot+1] = array[pivot+1],array[i]
        else:
            i += 1
        
    print(array)
    quicksort(array[:pivot])    # sorts lower
    quicksort(array[pivot:])    # sorts upper

    return array


test = [21,4,1,3,9,20,25,6,21,14]
print quicksort(test)

解决方法

这里的问题是您要切片list,该切片会返回副本而不是视图。因此,您的每个递归调用都会对一个副本而不是原始列表进行排序。我建议您使用numpy.array作为输入以执行就地快速排序。实际上,对numpy.array进行切片(基本)会返回a view。这是最接近规范数组的python数据结构。

,

进行递归调用quicksort(array[:pivot])时,不会将原始列表传递给quicksort(),而是创建一个新列表。

为避免创建新列表,可以删除slice语法,而是将数组索引传递给函数:

def quicksort(array,start,length):

    if length <= 1:
        return 

    pivot = start + length - 1
    i = start

    while i < pivot:
        if array[i] > array[pivot]:
            if i == pivot - 1:
                array[i],array[pivot] = array[pivot],array[i]
            
            array[pivot],array[pivot-1] = array[pivot-1],array[pivot]
            pivot -= 1
            array[i],array[pivot+1] = array[pivot+1],array[i]
        else:
            i += 1
        
    print(array[start:start+length])
    quicksort(array,pivot-start)    # sorts lower
    quicksort(array,pivot,length-pivot)   # sorts upper

    return array


test = [21,4,1,3,9,20,25,6,21,14]
print quicksort(test,len(test))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...