算法入门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:排序 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

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