快速排序未返回预期结果-Python3

快速排序未返回预期结果-Python3,python,python-3.x,Python,Python 3.x,我一直在研究一种快速排序算法,该算法专门将墙设置在左侧,当前元素设置在墙的右侧,轴设置在数据集的末尾。 排序会将当前元素与枢轴进行比较,并在每次大于枢轴时递增当前元素。当它小于或等于轴时,它应将当前图元与墙右侧的项目交换,并将墙向右移动一处 这是我的密码: def QuickSort(dataset, low, high): if (low >= high): return dataset else: #Set pivot to last e

我一直在研究一种快速排序算法,该算法专门将墙设置在左侧,当前元素设置在墙的右侧,轴设置在数据集的末尾。 排序会将当前元素与枢轴进行比较,并在每次大于枢轴时递增当前元素。当它小于或等于轴时,它应将当前图元与墙右侧的项目交换,并将墙向右移动一处

这是我的密码:

def QuickSort(dataset, low, high):
    if (low >= high):
        return dataset
    else:
        #Set pivot to last element
        pivot = high
        #Set wall at first element
        wall = low
        #Loop through list - if current element is less or equal
        #to the pivot, swap current element with element right of wall
        #and move wall on.
        for i in range(high):
            if (dataset[i] <= pivot):
                temp = dataset[wall]
                dataset[wall] = dataset[i]
                dataset[i] = temp
                wall = wall + 1
                if wall >= high:
                    break

        #recursively call for subsequent part of list
        QuickSort(dataset, low, wall-1)
        QuickSort(dataset, wall, high)

dataset = [1,6,2,3,6,7,4,2,5]
dataset_length = len(dataset)
sorted_data = QuickSort(dataset, 0, dataset_length)
print(sorted_data)

input()
def快速排序(数据集、低、高):
如果(低>=高):
返回数据集
其他:
#将轴设置为最后一个元素
枢轴=高
#在第一个图元处设置墙
墙=低
#循环列表-如果当前元素小于或等于
#对于轴,将当前图元与墙右侧的图元交换
#把墙移过去。
对于范围内的i(高):
如果(数据集[i]=高:
打破
#递归调用列表的后续部分
快速排序(数据集,低位,wall-1)
快速排序(数据集、墙、高)
数据集=[1,6,2,3,6,7,4,2,5]
数据集长度=len(数据集)
排序数据=快速排序(数据集,0,数据集长度)
打印(已排序的数据)
输入()
在运行代码时,数据集没有返回,我看不出哪里出了问题。谢谢您的帮助

pivot = high
这不会将轴设置为列表中的最后一个元素。相反,它会将轴设置为数据集的长度9。因此,将其更改为
dataset[high-1]

此外,您需要搜索大于
pivot
或小于
pivot
的元素的范围不是
range(high)
,而是
range(low,high)
,因为当您深入递归时,列表的大小以及它的开始和结束索引都会发生变化

def QuickSort(dataset, low, high):
    if (low >= high):
        return
    #Set pivot to last element
    pivot = dataset[high - 1]
    #Set wall at first element
    wall = low
    #Loop through list - if current element is less or equal
    #to the pivot, swap current element with element right of wall
    #and move wall on.
    for i in range(low, high):
        if (dataset[i] <= pivot):
            temp = dataset[wall]
            dataset[wall] = dataset[i]
            dataset[i] = temp
            wall = wall + 1
            if wall >= high:
                break
         #recursively call for subsequent part of list
    QuickSort(dataset, low, wall - 1)
    QuickSort(dataset, wall, high)

dataset = [1,6,2,3,6,7,4,2,5]
dataset_length = len(dataset)
QuickSort(dataset, 0, dataset_length)
print(dataset)
def快速排序(数据集、低、高):
如果(低>=高):
返回
#将轴设置为最后一个元素
pivot=数据集[高-1]
#在第一个图元处设置墙
墙=低
#循环列表-如果当前元素小于或等于
#对于轴,将当前图元与墙右侧的图元交换
#把墙移过去。
对于范围内的i(低、高):
如果(数据集[i]=高:
打破
#递归调用列表的后续部分
快速排序(数据集,低,墙-1)
快速排序(数据集、墙、高)
数据集=[1,6,2,3,6,7,4,2,5]
数据集长度=len(数据集)
快速排序(数据集,0,数据集长度)
打印(数据集)

如果执行
else
块,函数将不会命中return语句,因此它将返回
None
。可能您的意思是在末尾使用
返回dataset
。用临时变量交换变量是一种非常简单的方法。在python中,您希望执行dataset[i],dataset[wall]=dataset[wall],dataset[i]干杯MohitC-你说得太对了!你也更改了for语句吗?可能想在你的回答中指出这一点太棒了!谢谢。我可以问一下,为什么要将返回的数据集存储在附加到初始函数调用的变量中(即result=QuickSort(dataset,0,dataset_length))结果是一个布尔值,而不是列表本身?@sw123456您的函数不返回任何内容。因此返回
None
。此外,
None
不是
boolean