在看《编写高质量代码——改善python程序的91个建议》一书时,看到第一页提到了快速排序算法。特地学习一下。
一、快速排序简介
快速排序(Quick Sort)是一种效率很高的排序算法,是对冒泡排序的一种改进排序算法。
快速排序首先任意选取一个数据(通常选待排序列表中的第一个数)作为基准数据,将待排序列表中的数据分割成独立的两部分,所有比基准数据小的数都放到它左边,所有比基准数据大的数都放到它右边,此时基准数据排序完成,第一轮快速排序完成。然后再按此方法对两部分的数据分别进行快速排序,整个排序过程可以递归进行,直到被分割的数据只有一个或零个时,递归结束,列表排序完成。
快速排序的名字起得简单直接,因为这种排序算法速度快,效率高,是处理大数据最快的排序算法之一。
二、快速排序原理
快速排序的原理如下:
-
从待排序列表中选取一个基准数据(通常选取第一个数据)。
-
将待排序列表中所有比基准数据小的元素都放到基准数据左边,所有比基准数据大的元素都放到基准数据右边(升序排列,降序反之)。用基准数据进行分割操作后,基准数据的位置就是它最终排序完成的位置,第一轮排序完成。
-
递归地对左右两个部分的数据进行快速排序。即在每个子列表中,选取基准,分割数据。直到被分割的数据只有一个或零个时,列表排序完成。
伪代码
function quicksort('array')
if length('array')≤ 1
return 'array' // 显然,0个或1个元素的数组是已经排好顺序的,也就是无需排序
select and remove a pivot element 'pivot' from 'array' // see 'Choice of pivot' below
create empty lists 'less' and 'greater'
for each 'x' in 'array'
if 'x'≤ 'pivot'
then append 'x' to 'less'
else
append 'x' to 'greater'
return concatenate(quicksort('less'), list('pivot'), quicksort('greater'))
// 2个递归调用
伪代码中文翻译版
function quicksort(数组)
如果 数组的长度 ≤ 1
返回 数组 // 显然,0个或1个元素的数组是已经排好顺序的,也就是无需排序
从 数组中 选择并移除 一个基准元素 pivot
// 关于基准元素的选择,下面会有说明(注意:这部分在伪代码中通常不展开具体实现)
创建空列表 less 和 greater
对于 数组 中的每个 元素x
如果 元素x ≤ pivot
则 将 元素x 添加到 less 列表中
否则
将 元素x 添加到 greater 列表中
// 此处把less列表, 只包含pivot的单元素列表 和 greater列表合并起来
最终列表=concatenate(quicksort('less'), list('pivot'), quicksort('greater'))
返回 最终列表
python快速排序算法实现
def quicksort(to_be_sorted_list):
"""
对列表进行快速排序.
Args:
to_be_sorted_list (list): 需要排序的列表.
Returns:
list: 排序后的列表.
使用快速排序算法对列表进行排序.该算法通过选取一个基准元素(pivot),将列表分为两部分:小于等于基准的元素和大于基准的元素,
然后递归地对这两部分进行相同的操作,直到列表被完全排序.
"""
if len(to_be_sorted_list) <= 1:
# 如果列表为空或只包含一个元素,则无需排序,直接返回.
return to_be_sorted_list
pivot = to_be_sorted_list[0]
# 创建两个空列表,用于存储小于等于基准的元素和大于基准的元素.
less = []
greater = []
# 遍历列表(从第二个元素开始,以避免重复处理基准元素).
for x in to_be_sorted_list[1:]:
if x <= pivot:
less.append(x)
else:
greater.append(x)
# 递归地对小于等于基准的列表和大于基准的列表进行排序.
# 然后将排序后的列表与基准元素合并.
result = quicksort(less)
result.append(pivot)
# extend直接在列表末尾添加元素
# 列表加法在Python中实际上是创建了一个全新的列表,
# 并将所有元素从原始列表中复制过来,这在处理大数据集时可能会非常耗时.
result.extend(quicksort(greater))
# 返回排序后的列表.
return result