关于快速排序运行近乎有序数组

来源: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回答

liuyubobobo

2019-08-11

python 默认的递归栈比较浅,可以使用如下代码设置Python的递归栈深度:

// 设置递归栈深度为 10 万
sys.setrecursionlimit(100000)


对于你的生成近乎有序数组的方式有bug,每次arr中存的都是n,所以是一个包含相同元素的数组。对于包含大量重复元素的数组,加入随机化改进以后,依然会退化成为O(n^2) 的算法,课程后续会介绍如何继续优化。


正确实现的随机化快排,对于近乎有序的数组,应该不会超过系统的栈深度的。


加油!:)

0
1
weixin_慕雪2209780
好吧,我的添加操作写错了,把i写成了n 谢谢老师
2019-08-11
共1条回复

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

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

11187 学习 · 1614 问题

查看课程