快速排序未返回预期结果-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
。