数组个数差别导致快速排序算法报错
来源: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回答
-
最原始的快速排序在数组近乎有序时时间复杂度会退化为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多一点,
所以这个问题在这里是解决不了的,只有通过后面课程的算法优化解决。
022019-02-28 -
liuyubobobo
2019-02-28
@qq_DX_5 回答的完全正确。对于近乎有序的数组,不使用随机化,每次递归划分将极度不平衡,整个递归树的深度近乎为n。当n过大,就会导致递归调用系统栈溢出。
除了修改系统栈深度,治本的方法,是加入随机化,所以,就有了课程后续的内容:)
继续加油!:)
112019-02-28
相似问题
我发现课程的双路快排和三路快排有区别
回答 2
归并排序求逆序数
回答 1