我写了一个如下的递归随机快速排序函数:
def randomized_quick_sort(a, l, r):
if l >= r:
return
k = random.randint(l, r)
a[l], a[k] = a[k], a[l]
m1, m2 = partition3(a, l, r)
randomized_quick_sort(a,l,m1-1)
randomized_quick_sort(a,m2+1,r)
下面给出了使用的分区功能,该功能将列表分为三个部分,小于枢轴,等于枢轴和大于枢轴,其中枢轴是输入列表中的第一个元素。
def partition3(a, l, r):
x = a[l]
less, equal, greater = [], [], []
for val in a[l:r+1]:
if val < x:
less.append(val)
if val == x:
equal.append(val)
if val > x:
greater.append(val)
a[l:r+1] = less + equal + greater
m1 = len(less)
m2 = m1 + len(equal) - 1
return m1, m2
如果我在一个简单的输入(例如
)上多次运行此快速排序功能a = [2,2,3,3]
randomized_quick_sort(a,0,len(a)-1)
仅几次尝试后,我收到“超过最大递归深度”错误。请帮忙!
答案 0 :(得分:1)
这实际上很接近,但是我建议自己测试def partition3(a, l, r)
。您会发现它返回的值实际上没有任何意义。
但是,只需稍作更改,我们便可以使其正常工作:
m1 = len(less)
应为:
m1 = len(less) + l # l for left, not 1 for one
您不希望m1只是less
中项目的长度,因为如果您一直在比较第9项和第11项,则当您打算返回10时将返回1。
此外,通常,请尽量避免使用单字母变量名(尤其是l
,它很容易与1混淆)。这使得它很难阅读,也使不熟悉您的代码的人很难看到正在发生的事情。
答案 1 :(得分:0)
quicksort算法的特性之一是它是一种就地排序算法,即,它不需要额外的空间即可对给定列表进行排序。您可以在输入列表中跟踪索引,并交换元素以就地进行排序。 这是示例解决方案
import random
def partition(arr, start, end):
pivot = arr[end]
ix = start
for i in range(start, end):
if arr[i] <= pivot:
arr[i], arr[ix] = arr[ix], arr[i]
ix += 1
arr[ix], arr[end] = arr[end], arr[ix]
return ix
def quick_sort(arr, start, end):
if start > end: return
rand_num = random.randint(start, end)
arr[rand_num], arr[end] = arr[end], arr[rand_num]
ix = partition(arr, start, end)
quick_sort(arr, start, ix-1)
quick_sort(arr, ix+1, end)
arr = [2,4,7,8,9,1,3,5,6,12,32]
quick_sort(arr, 0, len(ans)-1)
output:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 32]