用于对int列表进行排序的递归函数

时间:2014-11-11 05:43:53

标签: python recursion

我想定义一个递归函数可以对任何一个int列表进行排序:

def sort_l(l):
    if l==[]:
        return []
    else:
        if len(l)==1:
            return [l[-1]]
        elif l[0]<l[1]:
            return [l[0]]+sort_l(l[1:])
        else:
            return sort_l(l[1:])+[l[0]]

在列表[3,1,2,4,7,5,6,9,8]上调用此函数应该会给我:

[1,2,3,4,5,6,7,8,9]

但我明白了:

print(sort_l([3, 1, 2,4,7,5,6,9,8]))--> [1, 2, 4, 5, 6, 8, 9, 7, 3]

请帮我解决问题,实际代码将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:4)

quick sort是递归的,易于在Python中实现:

def quick_sort(l):
    if len(l) <= 1:
        return l
    else:
        return quick_sort([e for e in l[1:] if e <= l[0]]) + [l[0]] +\
            quick_sort([e for e in l[1:] if e > l[0]])

会给:

>>> quick_sort([3, 1, 2, 4, 7, 5, 6, 9, 8])
[1, 2, 3, 4, 5, 6, 7, 8, 9]

答案 1 :(得分:1)

为此您需要使用合并排序。基本上在合并排序中,您递归地将列表拆分为一半,直到您拥有单个元素,然后以正确的顺序重新构建它。 merge sort on的复杂度为O(n log(n)),是一种非常稳定的排序方法。

以下是合并排序的一些很好的深度解释和视觉效果:

答案 2 :(得分:0)

def quicksort(lst):
    "Quicksort over a list-like sequence"
    if len(lst) == 0:
        return lst
    pivot = lst[0]
    pivots = [x for x in lst if x == pivot]
    small = quicksort([x for x in lst if x < pivot])
    large = quicksort([x for x in lst if x > pivot])
    return small + pivots + large

上面是一个更易读的快速排序算法的递归实现。上面的代码来自O&#RE;翻译的python中的函数编程 以上功能将产生。

list=[9,8,7,6,5,4]
quicksort(list)
>>[4,5,6,7,8,9]

答案 3 :(得分:0)

def sort(array, index = 0, bigNumber = 0):
  if len(array) == index:
    return array

  elif bigNumber > array[index]:
    array[index - 1] = array[index]
    array[index] = bigNumber
    bigNumber = array[0]
    index = 0

  else:
    bigNumber = array[index]

  return sort(array, (index + 1), bigNumber)