当我尝试自行创建快速排序时,我正在处理此问题 我不知道该如何解决该错误,而且我当然也不确定我的代码中是否存在其他任何问题。
def Qsort(list):
if len(list) < 2:
return list
Qsorthelper(list, 0, len(list)-1)
def Qsorthelper(list, first, last):
if last>first:
split=partition(list, first, last)
Qsorthelper(list, first, split-1)
Qsorthelper(list, split+1, last)
def median(list):
if len(list) %2 == 0:
return (len(list)//2+len(list)//2-1)/2
else:
return len(list)//2
def finditem(list, num):
for i in range(0,len(list)-1):
if num == list[i]:
return i
def choosepivot(list):
if list[0] > list[len(list)-1] > list[median(list)] or list[0] <
list[len(list)-1] < list[median(list)]:
return list[len(list)-1]
elif list[len(list)-1] > list[0] > list[median(list)] or
list[len(list)-1] < list[0] < list[median(list)]:
return list[0]
else:
return list[median(list)]
def partition(list, first, last):
pivot = choosepivot(list)
list.append(pivot)
list.remove(pivot)
left = list[first]
right = list[last-1]
done = False
while not done:
while left <= right and list[left] <= pivot:
left = left + 1
while right >= left and list[right] >= pivot:
right = right - 1
if right < left:
done = True
else:
temp = list[left]
list[left] = list[right]
list[right] = temp
temp = list[finditem(list,pivot)]
list[finditem(list,pivot)] = list[right]
list[right] = temp
return right
alist = [54,26,93,17,77,31,44,55,20]
Qsort(alist)
print(alist)
我不知道是什么原因导致了错误,但我真的想修复它 有任何建议或答案吗?
编辑: 我更改了finditem部分,以修复找不到最后一个元素的问题:
def finditem(alist, num):
for i in range(0,len(alist)):
if num == alist[i]:
return i
我收到此错误:
File "C:\Users\user\Desktop\ITB\failed quick sort.py", line 59, in partition
alist[finditem(alist,pivot)] = alist[right]
IndexError: list index out of range
>>>
temp = list[finditem(list,pivot)]
list[finditem(list,pivot)] = list[right]
list[right] = temp
这部分是我用枢轴切换最终项目以完成一个周期的部分,这里有些错误,但我想知道如何做。
答案 0 :(得分:1)
导致上述错误的代码在您的finditem
函数中,该函数在最后一个元素之前停止。如果您要查找的项目恰好是最后一个元素,则返回None,并将其用作list
的索引(您不应使用list
作为变量名,因为它具有python中的另一个意思)。
这不是唯一的问题。 median
函数还可以返回浮点数,因此,即使大小大小的列表,使用它进行索引的任何操作(例如list[median(list)]
)都可能失败。
还有其他错误。我建议您分别测试每个功能,并建议您参考一些现有的实现方式。