【发布时间】:2017-08-06 23:04:49
【问题描述】:
我目前正在阅读算法简介 (CLRS)。在尝试解决练习 2.3-4 时,即通过递归排序 A[:n-1] 来编写 A 的插入排序。我已经编写了一个代码,我将在下面显示我生成随机数列表并尝试对其进行排序的代码,它适用于列表中最多一定数量的项目,但是当我将它增加到一千个时,我得到一个错误说最大递归深度超过了比较,从在线检查我注意到有一种方法可以将递归深度增加到某个值,但我不确定这是否是好的做法,或者我应该以某种方式改进我的代码。任何帮助,将不胜感激。谢谢你
import random
numlist = []
for i in range(1000):
numlist.append(i)
random.shuffle(numlist)
def rec_ins_sort(L):
if(len(L) == 1):
return L
else:
step = rec_ins_sort(L[:len(L)-1])
return insert(L[len(L)-1], step)
def insert(a, inp_list):
inp_list.append(a)
i = len(inp_list) - 2
while(i > 0 and inp_list[i] > a):
inp_list[i+1] = inp_list[i]
i -= 1
inp_list[i+1] = a
return inp_list
【问题讨论】:
-
列表大小的递归通常不是一个好主意。由于调用堆栈随项目数量而变化。
-
递归到与输入大小成比例的深度的算法不适合 Python。这是你在像 Scheme 这样的函数式语言中会做的事情,它旨在允许更深的调用堆栈。
-
归并排序不是一种使用分而治之的递归排序方法吗?这似乎有效。应该在哪里避免
-
@ariamis07: 那是因为它使用 O(log n) 递归,其中 n 是输入的 size .
-
没有。合并排序是一种分而治之 - 对数复杂性递归深度。
标签: python algorithm recursion insertion-sort