我被要求写一个'到位'Quicksort版本。创建了两个内部函数 - 一个递归函数和一个'就地排序',它选择随机数据库(需要问题),对列表进行排序并在排序后返回数据库的索引。
import random
def quicksort(lst):
def innerfunc(lst, start=0, end=(len(lst) - 1)):
temporal_pivot = subfunc(lst, start, end)
if (end - start > 1):
if (temporal_pivot == start or temporal_pivot == start + 1):
innerfunc(lst, temporal_pivot + 1, end)
elif (temporal_pivot == end or temporal_pivot == end - 1):
innerfunc(lst, 0 , temporal_pivot - 1)
else:
innerfunc(lst, 0 , temporal_pivot - 1), innerfunc(lst, temporal_pivot + 1, end)
def subfunc(l, start, end):
i_random = random.randint(start, end) # chooses random index!
l[i_random], l[start] = l[start], l[i_random]
i_pivot = start
pivot = l[start]
i = end
while i > i_pivot:
if l[i] <= pivot:
l.insert(i_pivot, l[i])
i_pivot += 1
l.pop(i + 1)
else:
i = i - 1
return i_pivot
return innerfunc(lst)
问题在于运行时间 -
包含100个或更多元素的列表排序非常慢。
你有一个想法如何改进“subfunc”算法和我的Quicksort性能吗?
谢谢!
奥伦
答案 0 :(得分:2)
问题在于重复拨打l.insert()
和l.pop()
。其中每个都有O(n)
复杂度,而您希望循环的每次迭代都为O(1)
。
您需要重新修改该函数,使其通过交换元素工作,而不是重复插入和删除。
您可以在Wikipedia中找到一些伪代码。
答案 1 :(得分:0)
似乎subfunc效率不高 - 循环并插入到数组部分。 我不是Python程序员,但我建议它可能导致内存重新分配并花费O(n)操作