面试必备算法|图解快速排序(Python)

简介: python图解快速排序

快速排序

快速排序的思想

​ 快速排序通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。具体步骤如下:

  • 从数列中挑出一个元素,称为"基准"(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区操作;
  • 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

图解快速排序

​ 这里展示放置第一个基准的过程,首先选择第一个数字作为基准。

在这里插入图片描述

​ 接下来我们在26和20的位置分别设置两个指针low和high,并用maddle来存储基准的值(使得列表中基准的位置可以用于元素替换)

在这里插入图片描述

​ 现在我们的目的是让小的数字在前面,大的数字在后面,鉴于我们现在在第一个基准的位置可以用于元素的替换(此处可以看作为空),所以我们从high指针开始进行操作(遍历向前直到找到比基准小的数字)。

在这里插入图片描述

​ 此时我们可以知道high的位置为空,也就是说high的位置可以用作下一个元素的存储位置,因此此时我们转换到操作low指针,通过low指针找到比基准54大的元素。

在这里插入图片描述

​ 和上面同样的原理,我们再继续操作high指针(这里展示剩下交换的过程,如果理解交换过程可以跳过)

在这里插入图片描述

​ 最后如果我们再把指针进行左移操作,就会使得low和high指针重合,此时重合的位置也就是我们最开始找到的基准(54)的位置,至此,我们就可以把基准(54)放到该位置上了。

在这里插入图片描述

​ 此时我们会发现在54前面的数字都比54小,后面的数字都比54大,这也就证明我们已经找好了54的位置,后续我们将54作为切分点,把前面和后面分成两个子列表并递归的执行上诉同样思想的操作就可以了。

快速排序的性质

最优时间复杂度:$O(nlog_2n)$
最坏时间复杂度:$O(n^2)$
稳定性:不稳定

快速排序代码实现

# start/end表示起始指针的位置(不是具体的值)
lst = list(map(int, input().split(',')))


def quick_sort(alist, start, end):
    # 如果前指针的位置大于等于后指针的位置

    if start >= end:
        return

    low = start
    high = end
    middle = alist[low]

    while low < high:
        while low < high and alist[high] >= middle:
            high -= 1
        alist[low] = alist[high]
        while low < high and alist[low] <= middle:
            low += 1
        alist[high] = alist[low]
    alist[low] = middle

    quick_sort(alist, start, low - 1)
    quick_sort(alist, low + 1, end)


quick_sort(lst, 0, len(lst) - 1)
print(lst)
相关文章
|
7月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
8月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
411 26
|
7月前
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
222 5
|
8月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
659 4
|
8月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
382 0
|
8月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
566 0
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
418 4

推荐镜像

更多