欢迎光临散文网 会员登陆 & 注册

【算法图解】个人学习笔记2——快速排序

2021-10-18 08:19 作者:达达里A  | 我要投稿

快速排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

1 、从数列中挑出一个元素,称为 "基准"(pivot)

2 、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作

3 、递归(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

这里简单的介绍一下递归的三个原则,

1、有基本的结束条件,比如这里结束条件是只剩两个数对比

2、问题规模不断减少,比如这里不断地对比两个数字,剩下的可以比的数不断减少

3、调用函数自身,例如累加返回return x+add(x-1)

本处代码"[x for x in arr if x<i]"为“list comprehension”(列表推导式)是一个python书写技巧,用法如下:

列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

这里我们将列表中每个数值乘三,获得一个新的列表:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]


教程讲解视频:【排序算法精华3】快速排序 (上)_哔哩哔哩_bilibili

#简单的快排代码如下:

def qsort(arr):

    if len(arr)<=1:

        return arr

    #元素数量为0或1,直接返回

    elif len(arr)==2:

        #有2个元素的情况

        if arr[0]>arr[1]:

            return arr[1],arr[0]

        else:

            return arr

    else:

        #选取标杆

        i=arr[0]

        #比标杆小的元素集合

        L=[x for x in arr if x<i]

        #比标杆大的元素集合

        R=[x for x in arr if x>i]

        #重复以上两个步骤并合并

        res=qsort(L)+qsort(R)+[i]

        return res

Myarr=[5,2.343,35,6,8,24,67]

qsort(Myarr)


【算法图解】个人学习笔记2——快速排序的评论 (共 条)

分享到微博请遵守国家法律