8行代码实现快速排序,简单易懂图解!

一、基线条件和递归条件

由于递归函数是自己调用自己,因此编写这样的函数时容易出错,从而导致无限循环。示例如下:

def countdown(i):
    print(i)
    countdown(i-1)

如果运行上述代码,就会发现一个问题:这个函数运行起来是不会停止,直到到达递归的最大深度。

正是因为这样,编写递归函数的时候,必须告诉它何时停止递归,所以每个递归函数都有两个部分:基线条件(base case)和递归条件(recursive case)。递归条件指定的是函数调用自己,而基线条件则指的是不再调用自己,从而避免循环。例如给 countdown 添加基线条件。

def countdown(i):
    print(i)
   	if i <= 1:	#<----------基线条件
        return
    else:	#<--------------递归条件
        countdown(i-1)

这样就按照预期那样执行,不会无限循环下去如图所示

递归函数

二、快速排序

因为对于排序来说,最简单的就是一个空列表,或者只包含一个元素的列表,所以可以将基线条件设置为空或只包含一个元素,在这种情况下,只需要返回原列表。

def quicksort(alist):
    if len(alist) < 2:
        return alist

思路如下图所示:

快速排序思路

代码如下:

def quicksort(alist):
    if len(alist) < 2:
        return alist	# 基线条件为空或只包含一个元素的列表是有序的。
    else:
        pivot = alist[0]	# 选择基准值
        less = [i for i in alist[1:] if i <= pivot]	# 由小于基准值的元素组成
        biggish = [i for i in alist[1:] if i > pivot]	# 由大于基准值的元素组成
        return quicksort(less) + [pivot] + quicksort(
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《8行代码实现快速排序,简单易懂图解!》
文章链接:https://zhuji.vsping.com/3513.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。