数组个数差别导致快速排序算法报错

来源:3-5 快速排序法 - Quick Sort

皓羽如风

2019-02-27

我用python实现了一下快速排序,在测试近乎有序的数组排序性能时,出现了问题:近乎有序的数组个数为1000,乱序的的为10组时是可以产生结果的,但当数组个数为10000,乱序的的为10组时则产生了报错:RecursionError: maximum recursion depth exceeded in comparison,请各位朋友帮忙解答一下
代码如下:

import numpy as np
import timeit, time
import random

class Sort(object):
    def random_array(self, n):
        """
        随机生成元素个数为n的数组
        """
        return list(np.random.randint(1000, size=n))

    def random_nearly_order_array(self, n, swaptimes):
	"""
        随机生成元素个数为n的数组,乱序为swaptimes组的近乎有序数组
        """
        nums = self.random_array(n)
        nums.sort()
        for i in range(swaptimes):
            x = random.randint(0, n)
            y = random.randint(0, n)
            nums[x], nums[y] = nums[y], nums[x]
        return nums
        
    def __partition(self, nums):
	"""
        确定一个数在数组中排序后的位置
        """
        n = nums[0]
        p = 0
        for i in range(1, len(nums)):
            if nums[i] < n:
                nums[i], nums[p+1] = nums[p+1], nums[i]
                p = p + 1
        nums[p], nums[0] = nums[0], nums[p]
        return p

    def quick_sort(self, nums):
        p = self.__partition(nums)
        if len(nums) == 1:
            return nums
        elif p == len(nums)-1:
            return self.quick_sort(nums[:p]) + [nums[p]]
        elif p == 0:
            return [nums[p]] + self.quick_sort(nums[p+1:])
        else:
            return self.quick_sort(nums[:p]) + [nums[p]] + self.quick_sort(nums[p+1:])
写回答

2回答

qq_DX_5

2019-02-27

最原始的快速排序在数组近乎有序时时间复杂度会退化为O(n^2),其实就是你调用了大约n次quick_sort方法,当n为1000时不报错,而n为10000时报错,是因为python是有最大递归深度限制的,默认是1000,可以通过

import sys
print(sys.getrecursionlimit())

查看,当数组个数n=1000时,没有超过最大递归深度,所以没报错,当n=10000,超过了最大递归深度,自然会报错。

这时可以通过

sys.setrecursionlimit(10000)

将最大递归深度设置为10000,虽然可以设置,但是python可以达到的最大递归深度大约为3000多一点,

所以这个问题在这里是解决不了的,只有通过后面课程的算法优化解决。

0
2
皓羽如风
非常感谢!我明白了!
2019-02-28
共2条回复

liuyubobobo

2019-02-28

@qq_DX_5 回答的完全正确。对于近乎有序的数组,不使用随机化,每次递归划分将极度不平衡,整个递归树的深度近乎为n。当n过大,就会导致递归调用系统栈溢出。


除了修改系统栈深度,治本的方法,是加入随机化,所以,就有了课程后续的内容:)


继续加油!:)

1
1
皓羽如风
了解这个意思了,谢谢你!
2019-02-28
共1条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11186 学习 · 1614 问题

查看课程