使用基数排序实现 std::sort 重载是否合法?

2024-03-21

对于适用的数据类型,良好的基数排序可以大幅击败比较排序,但是std::sort通常作为 introsort 实现。有没有理由不使用基数排序来实现std::sort?基数排序不足以实现std::sort因为std::sort仅要求类型具有可比性,但对于比较和基于基数的排序产生相同答案的类型(例如int)这似乎是一个悬而未决的果实,没有被采摘。

实施是否合法std::sort在适当的时候使用基数排序的重载?有什么要求吗std::sort从根本上防止这种情况发生?

Edit:我应该更清楚一点。我问标准库的实现这样做是否合法。我并不是在询问标准库实现的用户将任何内容放入std命名空间。我知道,除特殊情况外,这样做是违法的。


评论引用了“假设”规则。这其实是没有必要的。std::sort未指定“如同使用 introsort”。规格为std::sort很简短,只需要效果(已排序)和比较次数的复杂性(O(N log N))。基数排序满足两者。

25.4.1.1 排序

template<class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last);

template<class RandomAccessIterator, class Compare> void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

1 Effects:对[first,last)范围内的元素进行排序。

2 Requires:RandomAccessIterator 应满足 ValueSwappable (17.6.3.2) 的要求。 *first 的类型应满足 MoveConstructible(表 20)和 MoveAssignable(表 22)的要求。

3 复杂:O(N log(N )) (其中 N == 最后 - 第一个)比较。

在实践中,比较两个寄存器宽度值a<b即使我们使用位或十六进制数字,它也比提取数字并比较这些数字的序列要快得多。当然,这是一个常数因子差异,但提取和比较 32 个单独的位将比直接比较慢大约 100 倍。这击败了大多数理论上的担忧,特别是因为log N在今天的计算机上实际上不可能是 100。

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

使用基数排序实现 std::sort 重载是否合法? 的相关文章

随机推荐

  • Python - 在 Flask 中将查询结果从服务器返回到客户端

    我拥有的 我在 Flask 中有一个客户端 服务器 客户端将 JSON 格式的查询发送到服务器 服务器创建一个 JSON 文件 还有另一个工具可以接受此查询 在数据库上执行它并将结果写入 results txt 文件 服务器定期检查 结果
  • 如何在不隐藏控制框的情况下隐藏 WPF 功能区窗口(启用 Aero)中的标题栏?

    我目前使用 WPF Ribbon Window 并在当前窗口中启用 Aero 如下图所示 我喜欢隐藏标题 模式测试仪 因为没有足够的空间来显示它 但我还是需要原装windows控制盒以及当前标题 即使它会被隐藏 将显示在任务管理器和其他相关
  • for 循环进行多个扩展并对每个文件执行一些操作

    我试图在 bash 中编写一个 for 循环来获取扩展名为 jpg jpeg png 的文件 这是我的尝试 但不起作用 for file in arg jpg jpeg png do echo arg something jpg gt z
  • 抽象工厂模式讲解

    我正在研究设计模式并遇到Abstract Factory Pattern根据定义是 抽象工厂模式说只需定义一个接口或 用于创建相关 或依赖 对象系列的抽象类 但没有指定它们的具体子类 这意味着抽象 工厂让一个类返回类的工厂 但我无法彻底理解
  • 使用 Swift 4.2.1 编译的模块无法被 Swift 5.0 编译器导入

    我正在尝试按照说明将第三方应用程序集成到项目中https github com Paytm Payments Paytm iOS App Kit tree master Swift BitCodeDisabled PaytmNativeSD
  • 实体框架 CTP5 代码优先:将一个类与另一个类的多个集合映射

    使用 EF CTP5 Code First 我尝试映射一个类模型 该模型在一个类中包含指向另一个类的多个集合 这是我的意思的一个例子 public class Company public int CompanyId get set pub
  • php中的empty()、isset()和is_null()函数有什么区别?

    我做了很多研究 但无法找到这三者之间的区别 所以我做了一个简短的例子 希望对我们有所帮助 这是所有这三个的表格表示 Case Empty isset is null 1 a NULL 1 0 1 2 Not exists 1 0 1 War
  • 如何启用 :tsearch 字典进行 pg_search 多重搜索?

    我正在将 pg search 添加到 Rails 应用程序中 我正在按照 github 上的说明进行操作铁路广播公司 http railscasts com episodes 343 full text search in postgres
  • Web Components(原生UI)之间如何通信?

    我正在尝试为我的一个 UI 项目使用本机 Web 组件 对于这个项目 我没有使用任何框架或库 例如 Polymer 等 我想知道是否有最好的方法或其他方式在两个项目之间进行通信像我们在 AngularJS Angular 中所做的那样的 W
  • Flexslider - 动画:“幻灯片”,animationLoop:“true” - 冲突

    我有一个问题弹性滑块2 http www woothemes com flexslider在某些特定情况下 我将它用作内容滑块 我需要的是让动画幻灯片而不是淡入淡出 并循环播放幻灯片 我有 3 张幻灯片 其中包含 div 内容和更多列表 以
  • 致命错误:调用成员函数 getKeyName()

    我是 joomla 的新手 我创建了一个 joomla 组件 当我单击管理中的新按钮时 我收到这样的错误 致命错误 在 C xampp htdocs Joomla1 libraries joomla application componen
  • 现代 Unix/Linux 系统上的密码是否仍限制为 8 个字符?

    多年前 Unix 密码的长度限制为 8 个字符 或者如果密码长度超过 8 个字符 那么多余的字符也不会产生任何影响 大多数现代 Unix Linux 系统上仍然是这种情况吗 如果是这样 大约什么时候在大多数系统上可以使用更长的密码 有没有一
  • 将双精度数字舍入为以位数给定的较低精度的有效方法

    在 C 中 我想将双精度舍入到较低的精度 以便可以将它们存储在关联数组中不同大小的存储桶中 与通常的舍入不同 我想舍入到多个有效位 因此 大数字的绝对变化将比小数字变化大得多 但它们往往会按比例变化 因此 如果我想四舍五入到 10 个二进制
  • 为什么这个具有推导返回类型的内联方法尚未定义?

    include
  • RadGrid 底部的水平滚动空白

    我正在使用 RadGrid 从数据库检索数据 我的 RadGrid 中有更多列 因此我需要显示 RadGrid 水平滚动以防止页面扩展 但禁用垂直滚动 因此网格的高度应扩展以始终显示网格中的所有行 我得到了结果 但 RadGrid 底部有空
  • 使用 Chosen 链接选择

    我正在尝试将选择与Chosen https github com harvesthq chosen and Chained http www appelsiini net projects chained但我不确定我是否正确实现了 chos
  • 文件观察器创建事件

    我正在使用 net 文件监视程序监视文件夹中的某些类型的文件 mbxml 我正在使用 filewatcher 创建的事件 一旦创建的事件触发 我必须将此文件移动到另一个文件夹 这种方法的问题在于 一旦文件复制开始 就会触发创建的事件 因此
  • 存储用户时区的最佳实践 - TSQL/.Net

    我需要跟踪用户的时区 以便在他们指定的特定时间 在他们自己的时区 处理他们的信息 或不处理 显而易见的答案是将时区及其个人资料信息存储在用户数据库中 有点棘手的是夏令时 从下图中请注意 大多数北部和南部地区使用夏令时偏移 因此 存储时区偏移
  • 防止 PHP 脚本在运行时耗尽所有资源?

    我有一个每日 cron 作业 运行大约需要 5 分钟 它会收集一些数据 然后更新各种数据库 它工作正常 但问题是 在这 5 分钟内 该站点完全没有响应任何请求 无论是 HTTP 还是其他请求 看起来 cron 作业脚本在运行时会占用所有资源
  • 使用基数排序实现 std::sort 重载是否合法?

    对于适用的数据类型 良好的基数排序可以大幅击败比较排序 但是std sort通常作为 introsort 实现 有没有理由不使用基数排序来实现std sort 基数排序不足以实现std sort因为std sort仅要求类型具有可比性 但对