对数组 C 进行部分排序

2024-01-02

我有一个如下所示的数组:

int array[] = {4.53, 3.65, 7.43, 9.54, 0.72, 0.0}

我只是想知道我可以使用什么方法对该数组进行部分排序,以将前三个最大的双精度数放在前面。我正在寻找最有效的方法来获取该数组中前三个最高的数字。

到目前为止我一直在使用qsort,但我只是在寻找另一种方法来做到这一点,它可能会更快。我知道qsort is O(nlogn)对于最好的情况和O(n^2)对于最坏的情况,但是有没有更有效的方法来解决这个问题?我所说的高效只是一种更快的方法,比O(nlogn).

任何帮助都会很棒


只需保持第一、第二、第三即可。

   first =  array[0];
   second = array[1];
   third = array[2];

   /* scratch sort for three elements */
   if(first < second)
     swap(first, second);
  if(first < third)
     swap(first, third);
  if(second < third)
     swap(second, third);

  /* now go through, bubbling up if we have a hit */ 
  for(i=3;i<N;i++)
  {
      if(third < array[i])
      {
         third = array[i];
         if(second < third)
         {
            swap(second, third);
            if(first < second)
              swap(first, second);
         }
      }
  }     

我不会尝试扩展到 k = 4。我认为三个是关于硬编码的限制。随着 k 变大,您需要转向正式方法。

这并没有回答您实际提出的问题,即如何部分排序,但它似乎是您想要的。

如果您希望部分排序,您可以使用快速排序,并且只需在枢轴超出您感兴趣的界限时提前返回即可。所以我们的第一个枢轴分为五、二。忽略最后两个,只实际执行最后五个的子排序。虽然它比快速排序更快,但它不会改变游戏规则。如果您可以获得第 k 个项目的保守上限(例如,最小值和平均值之间最多始终为 25%),您可以快速消除大部分数据。如果你弄错了,那只是再过一两遍。

使用快速排序方法

  int sortfirstk_r(int *array, int N, int k)
  {
     int pivot = 0;
     int j = n -1;
     int i = 1;

     while(i <= j)
     {
        if(array[pivot] < array[i])
          swap(array[i], array[j--])
        else
          i++;

     }
     sortfirstk_r(array, i, k < i ? k : i);
     if(i < k)
       sortfirstk_r(array +i, N -i, k - i); 

  }

(未经测试,稍微棘手的排序逻辑可能存在错误)。

然而,我们天真地使用第一个元素作为枢轴。如果我们对一个大型数据集进行排序,并且它具有正态分布,并且我们想要前 1%,则 z 得分为 2.326。采取更多一点以允许我们出现一些采样误差,我们将第一遍的枢轴设置为高于平均值 2.3 个标准差。然后我们将分布分成两组,前 1% 加一点,其余的。我们不需要进一步处理其余的,只需对最上面的组进行排序即可。

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

对数组 C 进行部分排序 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • jQuery / Ajax:如何循环遍历数组作为 Ajax 成功函数的一部分

    我有一个阿贾克斯调用返回一个数组并需要对该数组中的每个值执行某些操作 到目前为止 我有以下内容 但这会返回以下错误 Uncaught TypeError Cannot use in operator to search for length
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • PHP条件,如果当前页面,则链接突出显示[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个带
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • 不区分大小写的字符串比较 C++ [重复]

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

随机推荐

  • 打字稿路径无法解析

    Here https github com oleersoy typescript pathsGithub MCVE 显示了一个问题 npm run compile显示错误 我正在尝试这样做 import Todo from test 但这
  • 检测用户是否在颤动上按下 home / tab 的代码?

    是否有任何代码可以检测用户是否按下了 home tab 我想让我的音乐在按下时暂停 通过添加观察者来跟踪生命周期事件WidgetsBinding然后在应用程序暂停时暂停音乐 你可以看看this https github com flutte
  • 核心数据executeFetchRequest抛出NSGenericException(枚举时集合发生了变化)

    我正在使用 Core Data 开发 iPhone 应用程序 所有用户数据应与我们的服务器同步 为此 我创建了 NSOperation 的子类 它从我们的 Web 服务加载新数据并创建相应的托管对象 为了维护它们之间的关系 每个对象都使用远
  • 哪个是最好的 git 托管软件? - Gitolite vs. Gitlab vs. Gitorius [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找适合多个用户的 git 托管环境 因此我搜索了之间的比较Gitolite Gitlab and Gitorius 但我没有得到任何有用
  • YAML:YAML 中的字符串需要引号吗?

    我正在尝试编写一个用于 Rails 项目国际化的 YAML 字典 不过我有点困惑 因为在某些文件中我看到字符串用双引号引起来 而在某些文件中则没有 需要考虑的几点 示例1 https github com plataformatec dev
  • Powershell:使用字符串匹配条件将单个文件拆分为多个文件

    我有一个包含 1GB 数据的文件 该数据实际上是数十个或数千个单独的迷你文件 我需要提取每个单独的文件并将它们放入自己单独的不同文件中 所以本质上 我需要从单个文件变成 30K 单独的文件 这是 我的文件 的示例 文件名 1 版本 1 32
  • CRUDRespository 中的更新或 SaveorUpdate,是否有任何可用选项

    我正在尝试使用 My Entity bean 执行 CRUD 操作 CRUDRepository提供标准方法find delete and save但没有可用的通用方法 例如saveOrUpdate Entity entity 进而调用Hi
  • 如何将json对象显示为html?

    我的 Json 对象是这样的 attributes Code SGL Total 19421340 27 DayPrice Date 2016 07 22 Rate 4900439 85 Date 2016 07 23 Rate 48451
  • 绕过 Google 电子表格中的循环引用

    我有一个谷歌文档电子表格 有两列 A 和 B B 的值只是 A 中不同格式的值 并且我在 B 列中有一个公式可以进行转换 有时我没有 A 格式的值 但有 B 格式的值 我想通过在 A 列中添加进行反向转换的公式来自动获取 A 列中 A 格式
  • 如何在 vue.js 构建上重命名 index.html?

    我想重命名index html产生于npm run build 我在 webpack 配置中找不到任何内容 我还创建了一个vue config js此处描述 https github com vuejs vue cli tree dev d
  • React Redux 工具包:类型错误:无法读取未定义的属性“值”

    在我的项目中 我为 2 个不同的状态场景实现了 React Redux 工具包 并且它们工作得很好 现在我需要为 Redux 实现第三个状态场景 因此我遵循与前 2 个状态场景相同的模式 灵感来自 https react redux js
  • 为什么我的 Django 表单没有引发任何错误?

    我有一个简单的表单 每当用户在表单上做错事时 我想在 Django 上引发验证错误 问题是我设置了表单验证 但是当提交表单时使用错误的值时 它会通过 我想知道为什么会发生这种情况以及如何避免这种情况 这是 html 形式
  • 如何检查浏览器是否支持flash?

    我有一个 Flash 横幅 如果客户端浏览器没有启用 Flash 我想用静态图像替换它 我想知道我是否可以用 php 做到这一点 或者是否有人知道一个好方法 Thanks 允许 您的 Flash 影片 降级
  • 使用 Flask-limiter 限制端点速率

    我知道并且爱flask limiter来自较旧的项目 现在我想用它在我的flask restplus为基础的项目 我的最终解决方案将使我能够在每个方法级别上进行速率限制 因此 post 方法的费率与 get 方法的费率不同 但如果我可以定义
  • 在 while_loop 的上下文中使用 TensorArray 来累加值

    下面是 Tensorflow RNN Cell 的实现 旨在模拟本文中 Alex Graves 的算法 ACT http arxiv org abs 1603 08983 http arxiv org abs 1603 08983 在通过
  • 生命周期:ViewBag、TempData、ViewData 和 Session [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这些对于存储数据很有用 会话将在网络服务器设置的时间后销毁 Viewbag 和 ViewData 与视图一样工作 并在重定向时被销毁 临时数
  • 为什么带有引用程序集的 VS2012 项目无法自动定位 4.0

    在 Visual Studio 2012 C 控制台应用程序中 我将 NET Framework Target 从 4 5 降级到 4 0 安装了两个框架的 Win 7 Pro 然后我引用一个程序集 该程序集通过警告抱怨以下内容 The p
  • Scala 中的“副作用词法闭包”与函数

    In 他的回答的评论部分 https stackoverflow com questions 4262241 how to return a function in scala 4262932 comment4621217 4262932
  • 从powershell执行单向wcf服务操作

    我有一个计划任务 每小时执行一个 powershell 脚本 powershell 脚本必须调用单向 WCF 服务操作 本质上它只需要开始一项操作 我的问题是我该怎么做 我认为仅执行 url 实际上就会启动请求 但显然这是不正确的 这是我试
  • 对数组 C 进行部分排序

    我有一个如下所示的数组 int array 4 53 3 65 7 43 9 54 0 72 0 0 我只是想知道我可以使用什么方法对该数组进行部分排序 以将前三个最大的双精度数放在前面 我正在寻找最有效的方法来获取该数组中前三个最高的数字