如何用8行代码实现简单易懂的快速排序算法图解?

2026-04-11 13:171阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计748个文字,预计阅读时间需要3分钟。

如何用8行代码实现简单易懂的快速排序算法图解?

快速排序是一种常用的排序算法,比选择排序快得多。在我之前的随笔中,也写过关于快速排序算法的内容,可以看看和现在的区别。例如,Python实现快速排序的代码如下:

pythondef quick_sort(arr): if len(arr) <=1: return arr pivot=arr[len(arr) // 2] left=[x for x in arr if x pivot] return quick_sort(left) + middle + quick_sort(right)

快速排序是一种常用的排序算法,比选择排序快的多。在之前的我随笔中也写过关于快速排序的算法,也可以看一下和现在的区别python实现快速排序 - Mr-Yang` - 自由互联 (cnblogs.com)。

在看快速排序之前,要先了解一下递归,对于递归我之前的文章中也有提到python递归函数 - Mr-Yang` - 自由互联 (cnblogs.com),在这里我补充一个关于递归的一个点:基线条件和递归条件

一、基线条件和递归条件

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

如何用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(biggish) 学习之旅

本文共计748个文字,预计阅读时间需要3分钟。

如何用8行代码实现简单易懂的快速排序算法图解?

快速排序是一种常用的排序算法,比选择排序快得多。在我之前的随笔中,也写过关于快速排序算法的内容,可以看看和现在的区别。例如,Python实现快速排序的代码如下:

pythondef quick_sort(arr): if len(arr) <=1: return arr pivot=arr[len(arr) // 2] left=[x for x in arr if x pivot] return quick_sort(left) + middle + quick_sort(right)

快速排序是一种常用的排序算法,比选择排序快的多。在之前的我随笔中也写过关于快速排序的算法,也可以看一下和现在的区别python实现快速排序 - Mr-Yang` - 自由互联 (cnblogs.com)。

在看快速排序之前,要先了解一下递归,对于递归我之前的文章中也有提到python递归函数 - Mr-Yang` - 自由互联 (cnblogs.com),在这里我补充一个关于递归的一个点:基线条件和递归条件

一、基线条件和递归条件

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

如何用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(biggish) 学习之旅