《算法导论》第7章 快速排序

2023-05-16

        快速排序是一种非常快,但是不太稳定的排序,期望时间复杂度是nlgn,而且nlgn前面隐含的常数因子很小,然而在最坏的情况下,时间复杂度会到n^2(例如整体呈现逆序排列)。但是快速排序仍然是当前使用非常广泛的。

        快速排序的基本理解:分治思想(参见算法导论第4章),特点是原址性。

        思想:选中数列中某一个数字,把比它大的放在它的一侧,比它小的放在另一侧。这样会把数列分成两份,之后再对剩下的两份重复上述过程,直到数列的长度只有该元素本身即可。

        因为快速排序实在是非常常见,即使是在初高中生的信息学竞赛中也是必须掌握的内容,所以就不过多地介绍了,直接上源码:

def quick_sort(a, start, end):
    """
    快速排序的算法,递归
    :param a: 输入的数组
    :param start: 排序开始位置的索引
    :param end: 排序结束位置的索引
    :return: no return,但是return是递归过程回归所必要的
    """
    print(a, start, end)
    if start >= end:
        return
    tmp, i, j = a[start], start, end
    while i < j:
        print(a)
        while a[j] >= tmp and i < j:
            j -= 1
        else:
            a[i] = a[j]
        while a[i] < tmp and i < j:
            i += 1
        else:
            a[j] = a[i]
    a[i] = tmp
    quick_sort(a, start, i - 1)
    quick_sort(a, i + 1, end)


if __name__ == '__main__':
    # a = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]
    a = [16, 14, 10, 9, 8, 7, 4, 3, 2, 1]
    quick_sort(a, 0, len(a) - 1)

        另:随机化的快速排序。一般认为我们需要排序的数组,在任何时候都是无序且各种序列的出现概率相等,但是事实上并不是这样(比如总有人喜欢看看快排到底有多慢,非要给一个反过来的数列让你排)。在这样的情况下,如果我们再采用选取第一个元素为分界值的方法,就会达到快速排序的最坏情况。

        可能读者会说:那我选最后一个。事实上这也不能解决问题,如果测试者预先知道你的flag的选择方式,无论你是选择第一个、最后一个,还是二等分点甚至三等分点黄金分割点各种奇怪的选择方式,都可以找到一个相对较差的数列让排序过程实现接近最坏情况。因此,采用的方法是直接将这个过程随机化,让选取分界flag的方式是随机产生,这样就可以从统计学上使得排序所需要的时间走向统计平均值。

        当然,随机的快速排序仍然会有可能走到最坏的n平方情况,但是从可以从数学原理上杜绝人为因素和排序数列的伪随机等对于算法所需时间造成的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《算法导论》第7章 快速排序 的相关文章

  • 我阿里P7了解到的Android面试的一些小内幕!已拿offer

    前言 这些题目是网友去百度 小米 乐视 美团 58 猎豹 360 新浪 搜狐等一线互联网公司面试被问到的题目 熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率 欢迎一线公司员工以及网友提交面试题库 xff0c 欢迎留言 网上的都是按
  • 7月编程排行榜来啦!这次有何新变化?

    每月编程排行榜可能会迟到 xff0c 但永远不缺席 7月的编程排行榜已出 xff0c 接下来一起看看有哪些看点吧 Tiobe编程排行榜前20名 Tiobe编程排行榜Top 10趋势 TIOBE Index编程社区指数是编程语言流行度的一个指
  • 操作系统 记录型信号量实现生产者消费者问题(完整代码)

    问题描述 用信号量模拟生产者 消费者问题的过程 生产者和消费者两个线程共享同一个缓冲区 xff0c 生产者不断向缓冲区中添加产品 xff0c 消费者从缓冲区中消费产品 要保证缓冲区满了之后生产者不能再继续添加产品 xff0c 需要等消费者至
  • 制版经验分享—使用AD18

    文章目录 前言一 封装二 走线三 注意细节四 制版流程五 制版细节总结 前言 在做一些培训题目时 xff0c 由于时间有限制 xff0c 在外面开板会花费好几天的制作和快递时间 xff0c 所以有时候就需要自己制版 xff0c 在这里我记录
  • Java打印九九乘法表

    1 使用双重for循环打印九九乘法表 Java源代码如下 xff1a for int i 61 0 i lt 61 9 i 43 43 for int j 61 1 j lt 61 i j 43 43 System out print i
  • 解决selenium打开Chrome浏览器自动退出的问题

    好不容易安装好selenium和对应的浏览器驱动器后终于可以运行程序了 xff0c 结果发现一运行程序后浏览器打开就自动退出了 xff0c 但是我在Python代码中并没有写driver quit 方法 xff0c 上网查了查发现原来是我的
  • 在Java应用中嵌入sshd服务

    这个应用需要依赖apache mina的子项目sshd xff0c 项目主页http mina apache org sshd project index html xff0c 当前版本号为0 8 0 这里的sshd和Linux下的sshd
  • openssl开发库安装时的踩坑指南

    序 前几天用linux编译一个提权脚本的时候报错 openssl opensslv h 没有那个文件或目录 的问题 无论如何也解决不了 xff0c 这下我记录一个踩坑指南防止下一个人掉进坑里 操作 总体介绍 首先介绍一下 xff0c 这个报
  • 性能测试脚本用例【模板】

    产品名称Product name 密级Confidentiality level 秘密 产品版本Product version Total 12pages 共12页 性能测试脚本用例 仅供内部使用 拟制 日期 xff1a 审核 日期 xff
  • Java常见的集合类

    我们常见的Java集合类有List Set Map List 1 接口可以被继承 2 接口可以被多次实现 3 List和ArrayList package List import java util ArrayList import jav
  • WIN7我的电脑右键管理打不开

    问题现象 xff1a 我的电脑右键点击管理无法正常打开 xff0c 会弹出下面的报错信息 首先打开注册表 xff0c 打开运行 xff0c 输入regedit 选择路径 xff1a HKEY LOCAL MACHINE SOFTWARE C
  • LIKE的用法

    我们来谈谈关于like运算符的理解 xff1a 下面是like的语法 xff0c 以后使用到like运算符的都必须根据这个语法使用 LIKE 运算符是用来匹配通配符指定模式的文本值 如果搜索表达式与模式表达式匹配 xff0c LIKE 运算
  • 从0开始详细安装archlinux(UEFI启动)

    隔了一周没更新 xff0c 前阵子把电脑windows卸了装了个archlinux xff0c 不得不说arch是真的香 xff0c 但是坑也是真的多 xff0c 刚踩完所有的坑 xff0c 滚回来写blog了 注 xff1a 本贴为UEF
  • archlinux开机无法联网问题,以及安装archlinuxcn和yay管理器

    前一篇已经安装完了archlinux系统 xff0c 不过真正难的其实并不是安装 xff0c 你的路现在才开始 xff0c 哈哈 添加用户 建议 xff0c 不然使用登录管理器的时候不支持root用户 span class token fu
  • archlinux安装kde桌面和sddm登录管理器

    前几篇已经配置好了archlinuxcn软件仓库 xff0c 网络和nvidia驱动 xff0c 现在来给你的archlinux安装一个kde桌面 xff08 kde玩法有很多 xff0c 可以自己去搜一搜美化教程 xff09 xff0c
  • Spring框架学习

    目录 目录 学习内容 xff1a IoC java中创建对象有哪些方式 xff1a ioc的体现 xff1a DI 是ioc的技术实现 spring的第一个核心功能 ioc Spring 八大模块 Spring的特点 xff1a Sprin
  • CenOs6.7不能使用yum命令

    因为官方不维护了所以 先用更换源 wget O etc yum repos d CentOS Base repo https mirrors aliyun com repo Centos vault 6 10 repo https deve
  • PowerMock注解PowerMockIgnore的使用方法

    故事要从一个异常开始 xff0c 某天我在开发一个加密 解密特性 xff0c 算法使用的是3DES xff0c 样例代码如下 package org jackie study powermock import java io Unsuppo
  • 如何写一棵AVL树

    二叉查找树 二叉查找树有一个缺陷就是查询效率跟树的高度有关 在极端情况下 xff0c 查询效率为n 如何解决二叉查找树效率低问题 xff1f 要增加查询效率 xff0c 高效的方案是在插入的时候对树进行一下平衡操作 xff0c 降低树的高度
  • 点击超链接下载.pdf文件

    上代码 span class token keyword package span span class token class name Servlet span span class token punctuation span res

随机推荐