我在合并排序上查看维基百科的伪代码(以及sortvis.org和sorting-algorithm.com等其他网页),并看到合并的准备工作使用了递归。
我很想知道是否有一种非递归方式。
也许像for each i element in list, i=[i-th element]
。
我认为递归保持最小 - 因为它是不受欢迎的,因此我想到了这个问题。
以下是维基百科合并排序的递归部分的伪代码示例:
function merge_sort(list m)
// if list size is 1, consider it sorted and return it
if length(m) <= 1
return m
// else list size is > 1, so split the list into two sublists
var list left, right
var integer middle = length(m) / 2
for each x in m up to middle
add x to left
for each x in m after or equal middle
add x to right
// recursively call merge_sort() to further split each sublist
// until sublist size is 1
left = merge_sort(left)
right = merge_sort(right)
答案 0 :(得分:3)
Bottom-up merge sort是合并排序的非递归变体。
有关更详细的伪代码实现,请参阅此wikipedia page。
答案 1 :(得分:1)
middle = len(lst) / 2
left = lst[:middle]
right = lst[middle:]
列表切片工作正常。
答案 2 :(得分:1)
顺便说一下 - 递归本身并不是不可取的。
如果你的堆栈空间有限(你是否害怕 stackoverflow ?;-)),或者在某些情况下函数调用的时间开销非常令人担忧,那么递归是不可取的。
在大多数情况下,这些条件并不成立;代码的可读性和可维护性将更具相关性。在我看来,在递归表达时,合并排序等算法更有意义。