关于快速排序运行近乎有序数组
来源:3-6 随机化快速排序法
weixin_慕雪2209780
2019-08-10
from random import randint
from time import time
#快速排序
def __partition(arr, l, r):
mid = randint(l, r)
arr[mid], arr[l] = arr[l], arr[mid]
v = arr[l]
j = l
for i in range(l+1, r+1):
if arr[i] < v:
arr[j+1], arr[i] = arr[i], arr[j+1]
j += 1
arr[j], arr[l] = arr[l], arr[j]
return j
def quick_sort(arr):
__quick_sort(arr, 0, len(arr)-1)
def __quick_sort(arr, l, r):
if r <= l:
return
p = __partition(arr, l, r)
__quick_sort(arr, l, p-1)
__quick_sort(arr, p+1, r)
#生成一个近乎有序的数组
def generate_nearly_ordered_array(n):
arr = []
for i in range(n):
arr.append(n)
for i in range(100):
a = randint(1, 90)
b = randint(0, 100)
arr[a] = b
return arr
#运行快速排序
def t_sort5(arr):
quick_sort(arr)
return arr
#测试快速排序性能
def test_sort5(arr):
start_time1 = time()
t_sort5(arr)
time1 = time() - start_time1
return time1
n = 1000
arr = generate_nearly_ordered_array(n)
c5 = test_sort5(arr)
print(c5)
老师,这个基本的快速排序算法运行近乎有序数组时,在1000以内还可以用
一旦超过1000就报下面这个错,怎么回事?就算非常慢,也不至于报错吧。。
RecursionError: maximum recursion depth exceeded in comparison
我试了试,优化后也一样,还是报这个错,为什么会超过最大递归深度呢
1回答
-
python 默认的递归栈比较浅,可以使用如下代码设置Python的递归栈深度:
// 设置递归栈深度为 10 万 sys.setrecursionlimit(100000)
对于你的生成近乎有序数组的方式有bug,每次arr中存的都是n,所以是一个包含相同元素的数组。对于包含大量重复元素的数组,加入随机化改进以后,依然会退化成为O(n^2) 的算法,课程后续会介绍如何继续优化。
正确实现的随机化快排,对于近乎有序的数组,应该不会超过系统的栈深度的。
加油!:)
012019-08-11
相似问题