标签 递归 下的文章

快速排序(Python实现)

基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
下面这个图可以描述算法的实现过程:
快速排序

时间复杂度

快速排序是一种不稳定的排序方法,平均时间复杂度为O (nlogn),最坏情况和冒泡排序差不多,为O(n²)。

Python实现

# 简洁的实现方法
def quicksort(array):
  if len(array) < 2:
    return array
  else:
    pivot = array[0]
    less = [i for i in array[1:] if i <= pivot]
    greater = [i for i in array[1:] if i > pivot]
    return quicksort(less) + [pivot] + quicksort(greater)

print quicksort([10, 5, 2, 3]) # 结果:[2, 3, 5, 10]

# 比较容易理解的实现方法
def quick(list):
    if len(list) < 2:
        return list
    else:
        left = i = 0
        j = len(list) - 1
        
        while i != j:
            while list[j] >= list[left] and i < j:
                j -= 1

            while list[i] <= list[left] and i < j:
                i += 1
            
            if i < j:
                list[i], list[j] = list[j], list[i]
        list[i], list[left] = list[left],  list[i]
        return quick(list[left:i]) + [list[i]] + quick(list[i+1:])

注意理解:上面的第二种方法,挑选了左侧第一个数作为参考,内部循环则从对面,即列表末尾开始查找,因为如果从左侧开始查找,当满足条件i=j退出循环时,list[i]会比list[left]大,交换之后违反了左边小右边大的原则。

该实例中涉及Python的一个称作列表推导表达式的语法糖用法,即在for循环中嵌套使用if和else语句。例如:

oldList = [12, 3, 4, 6, 7, 13, 21]
newList = [x for x in oldList if x%2 == 0]
print newList # 结果:[12, 4, 6]
想了解更多Python语法糖知识,请参考:Python语法糖系列

python列表求和:循环实现与递归实现

循环实现:

def sum(arr):
  total = 0
  for x in arr:
    total += x
  return total

print sum([1, 2, 3, 4]) # 结果:10

递归实现:

def sum(arr):
  total = 0
  length = len(arr)
  if length == 0:
    return total
  else:
    return arr.pop(0) + sum(arr)
    
print sum([1,2]) # 结果:3

递归实现阶乘(Python版)

简单来说,递归就是程序(函数)调用自身(recursion)的编程技巧。下面的例子是经典的递归实现阶乘(factorial)案例:

def fact(x):
  if x == 1:
    return 1
  else:
    return x * fact(x-1)

fact(3)

#输出结果:6

使用递归需要注意:

  • 递归指的是调用自己的函数。
  • 每个递归函数都有两个条件:基线条件和递归条件。