算法入门Bu1:排序

2023-11-13

算法入门(BuBuBu)

相关数据结构:

栈 队列 链表 树 并差集 堆 图等;

相关算法:

排序 枚举 深度和广度优先搜索 图的遍历 图中最短路径算法 最小生成树算法 割点和割遍算法 二分图的最大匹配算法等;

排序算法

简单的桶排序

特点:

  • 如果需要排序n个数,数的范围是0-m,可以使用一个1维数组a[m+1],记录0-m这m+1个数出现的次数,可以看做是m+1个桶,各自装了对应数出现的次数(数值即下标),循环桶 及 各桶中数字的出现次数,即可实现对n个数的排序;
  • 时间复杂度:O(m+n);

缺点:

每一个桶记录的次数,无法对应具体分数的其他信息;
很浪费空间,申请的桶个数需要是数据范围数m+1,但可能实际需要排序的数字很少;排序小数的话也会很麻烦;

冒泡排序

特点:

  • 每次比较两个相邻的元素,如果它们的顺序错误就把他们交换过来;一直比较,最后一个就会是最大/最小值;如同一个气泡,向上“起泡”,直到最后一位;
  • 第一趟会得到一个最大/小值,第二趟比较会得到第二大/小的值… 每一趟只能将一个数归位,已经归位的不必再参与排序;如果是n个数需要排序,只需将n-1个数归位,只需要n-1趟即可;
  • 时间复杂度:O(n^2);

应用:

结合复杂的数据结构数组,可以避免 简单桶排序 的第一个问题;

缺点:

时间复杂度很高,执行效率低;

快速排序

特点:

  • 最常用的排序;相比于 桶排序的浪费空间,冒泡排序的“慢”,快速排序就要好多了;
  • 首先从待排序的数据中随机选择一个 基准数(P),接下来将这个序列中比基准数大的放右边,比之小的放左边(假设从小到大排序);

实现方式:

  • 分别从初始序列的左右两端”探测“:从左往右找直到遇到一个比P大的数,再从右向左找一个比P小的数,将两者交换;可以使用两个”哨兵“变量i、j,开始时分别指向需要排序的序列的最左边和最右边;
  • 如果P选择的是最左边的数,则右哨兵j可以先行探测;(一定是从j开始,否则最后i、j相遇时,与P交换的会是一个比P大的值)
  • 当i、j相遇时,将相遇点与基准点交换;完成第一轮探测;
  • 基于P分割的两个序列,继续使用上述方式;

快速排序的每一轮处理 其实就是将这一轮的基准数 归位;所有基准数都归位了,排序也就结束了;

相比与冒泡排序交换相邻,快速排序的交换是跳跃式的;最坏的情形,其时间复杂度和冒泡一样都是O(n^2);平均的时间复杂度:O(n*log n);

快速排序基于二分的思想;基于while循环和递归调用,可以方便的写出一个递归的快速排序;非递归的快排使用栈实现,参考之前写过的一篇《 排序算法-快速排序》;

其他排序

选择排序、计数排序、基数排序、插入排序、归并排序、堆排序(基于二叉树);

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

算法入门Bu1:排序 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • TensorFlow图变量tf.Variable的用法解析,后面的name属性和前面的变量名有什么关系?如果不同,在调用上以谁为准?

    jjjj32481 后面的name属性和前面的变量名有什么关系 如果不同 在调用上以谁为准 UESTC C2 403回复 jjjj32481 name这个属性就是给变量取个名字 你可以用name这个属性函数查看一下 如果没有取名 那么输出就
  • 解决Port xxxx was already in use 端口被占用问题

    解决Port xxxx was already in use 端口被占用问题 通过快捷键Window R 键入cmd 进入命令行 1 输入如下命令查看端口被占用的进程 netstat ano findstr 8088 可以发现端口8088被
  • 程序员绩效总结_程序员吐槽,绩效工资与bug数量挂钩,网友:那就别敲代码

    近日 一个程序员提了一个问题 引起热议 该程序员表示 绩效跟bug数量挂钩合理吗 bug多就扣工资 连续几个月的话还辞退 对此 很多网友都认为完全不合理 如果是这样的话 那不敲代码岂不是就没有bug了 这完全有种为辞退找理由嘛 有句俗话说得
  • Linux系统中部署软件

    目录 1 Mysql 2 Redis 3 ZooKeeper 声明 致谢 1 Mysql 参考 CentOS7安装MySQL 补充 执行 rpm import https repo mysql com RPM GPG KEY mysql 2
  • node学习—validate数据库验证

    数据库验证 一 数据库验证 一 数据库验证 service studentService const Student require models Student const Op require sequelize const Class
  • STM32对接涂鸦wifi模块项目记录(智能插座完善版本)

    应项目需求 客户需要对接涂鸦平台 从了解平台到样品实际落地 还是挺方便的 做过的一个项目 人体感应智能插座项目 对接涂鸦云 硬件平台 STM32F103 WIFI模块 涂鸦WiFi 型号见文章说明 云平台 涂鸦云 更新项目原理图部分说明 更
  • Linux nmcli控制NetworkManager的命令行工具

    RHEL7 与 CentOS 7 以上的版本中默认的网络服务由 NetworkManager 提供 简称NM 这是动态控制及配置网络的守护进程 它用于保持当前网络设备及连接处于工作状态 同时也支持传统的 ifcfg 类型的配置文件 Netw
  • 盘点俄罗斯程序猿写的几款软件,你用过几个?最后1个是我的童年

    1 7zip 7 Zip 作者 abhishek prakash 是一款 开源 的 免费 软件 大多数源代码都基于 GNU LGPL 许可协议下发布 部分代码基于 BSD 3 句条款 BSD 3 clause 许可协议发布 可以在任何一台计
  • java private 构造函数_java-构造函数是否必须总是公开的?

    java 构造函数是否必须总是公开的 这个问题已经在这里有了答案 java中private构造函数的用法是什么 10个答案 我的第一个问题是 class Explain public Explain 构造函数应始终声明为公共吗 如果我创建2
  • Nginx 解决做反向代理时 静态资源图片、 js、css 访问不到

    在反向代理时添加另一个规则 反向代理 location proxy pass http localhost 9001 解决js css 访问不到的问题 location proxy pass http localhost 9001 prox
  • Lua 学习笔记:沙盒

    背景知识 Lua 给我的感觉是 各种内置函数和标准库的存在感都是比较强的 如果执行这句 for name in pairs G do print G end 就会把各种环境中已存在名称的打印出来 全局变量 比如字符串 VERSION 内置函
  • Linux系统简介和各发行版介绍

    一 Linux 简介 二 Linux和UNIX的关系及区别 UNIX 的发展历史 Linux 和 UNIX 的关系 区别 三 Linux 的发行版介绍 Linux各发行版简介 Debian 以社区的方式运作 Redhat 商业公司维护的发行
  • 使用 OpenSSL API 建立安全连接 - 双向认证

    使用 OpenSSL API 进行安全编程 一 概念 1 什么是 SSL SSL 是一个缩写 全称是 Secure Sockets Layer 它是支持在 Internet 上进行安全通信的标准 并且将数据密码术集成到了协议之中 数据在离开
  • mybatis log插件

    目前idea当中已经实施收费了 最近找了一个不收费的插件安装上重启一下就行了 点我下载提取码 sjc8
  • 如何提取视频的m3u8地址

    1 用360浏览器或者其他Chrome内核浏览器打开优酷网页 2 在播放页面按F12打开审核模式 3 点击如图图标模拟移动设备 4 设置模拟的设备 5 按F5刷新即可进入手机版网页 6 点击Network 7 点击Media 8 点击播放按
  • 2017年蓝桥杯B组C/C++省赛-分巧克力

    题目 题目链接 题解 二分 想到二分比实现二分要难点 可行解部分可以与不可行解部分完美地分隔开来 绿色部分是分成的巧克力比较小时都可以满足 而大于一定程度的时候就不可行了 所以可以将其抽象成小于可行 大于不可行的二分问题 在判断时 遍历全部
  • JAVA的分支结构

    分支结构 基本概述 当需要进行条件判断的时候 并且根据条件是否成立来执行某一段代码的时候 需要分支结构 1 if结构 if 布尔表达式 语句块 如果布尔表达式为true将执行的语句 如果布尔表达式的值为 true 则执行 if 语句中的代码
  • 四大私募量化策略解析——阿尔法、套利、期货CTA、高频交易

    近年来 随着证券市场规模的不断扩大 金融衍生产品不断推出 投资策略和盈利模式发生根本性改变 投资复杂程度日益提高 导致证券市场投资者的构成比例出现了相应的变化 专业投资管理人的占比越来越大 且有加速之势 另一方面 量化对冲投资策略以其中低风
  • Unity制作FPS Demo

    等到把这个Unity FPS Demo 僵尸杀手 完成后再详细补充一下 使用Unity制作FPS游戏的经历 今天做个标识
  • 算法入门Bu1:排序

    算法入门 BuBuBu 相关数据结构 栈 队列 链表 树 并差集 堆 图等 相关算法 排序 枚举 深度和广度优先搜索 图的遍历 图中最短路径算法 最小生成树算法 割点和割遍算法 二分图的最大匹配算法等 排序算法 简单的桶排序 特点 如果需要