在随机的快速排序最大递归深度误差

问题描述 投票:2回答:2

我已经写了如下的递归随机快速排序功能:

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)

只有少数的审判后,我得到一个“最大递归深度超过”错误。请帮忙!

python sorting recursion quicksort
2个回答
1
投票

这实际上是非常接近的,但我本身推荐的测试def partition3(a, l, r)。你会看到,它返回的值并没有真正意义。

然而,在一个小的变化,我们可以得到它的工作:

m1 = len(less)

应该:

m1 = len(less) + l # l for left, not 1 for one

你不想M1只在less物品的长度,因为如果你已经第九比较到11项你会返回1,当你的意思是返回10。

此外,在一般情况下,尽量避免单个字母的变量名(尤其是l这很容易混淆1)。这使得它难以阅读和努力的人不熟悉你的代码,看看发生了什么。


0
投票

一个快速排序算法的特性是,它是一个就地排序算法,即它并不需要额外的空间来排序定列表。您可以跟踪在输入列表索引和交换的元素做排序就地。这里有一个例子解决方案

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]
© www.soinside.com 2019 - 2024. All rights reserved.