3 次划分的中位数

2023-12-11

我找到了以下代码,用于使用第一个、最后一个和中间元素的中值查找快速排序的枢轴:

int middle = ( low + high ) / 2;
if( a[ middle ].compareTo( a[ low ] ) < 0 )
    swapReferences( a, low, middle );
if( a[ high ].compareTo( a[ low ] ) < 0 )
    swapReferences( a, low, high );
if( a[ high ].compareTo( a[ middle ] ) < 0 )
    swapReferences( a, middle, high );

// Place pivot at position high - 1
swapReferences( a, middle, high - 1 );
Comparable pivot = a[ high - 1 ];

我想知道找到中位数后,为什么交换是用索引高1而不是高?


原因是该算法不仅找到中位数,还对低、中、高元素进行排序。经过三种排列后,您知道 a[middle]

让我们看一个例子:低=0,中=4,高=8。你的数组是这样的:

lowerOrEqualToPivot X X X pivot X X X greaterOrEqualToPivot

如果将 middle 与 high 交换,则需要将 8 个元素划分在括号之间:

[ lowerOrEqualToPivot X X X greaterOrEqualToPivot X X X ] pivot

如果将 middle 与 high-1 交换,则只需拆分 7 个元素:

[ lowerOrEqualToPivot X X X X X X ] pivot greaterOrEqualToPivot

顺便说一句,第一行有一个错误:

int middle = ( low + high ) / 2; //Wrong
int middle = ( low + high ) >>> 1; //Correct

原因是,如果 (low + high) 大于 Integer.MAX_VALUE,则会发生溢出,并且 middle 将为负数。第二行总是会给你一个积极的结果。

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

3 次划分的中位数 的相关文章

随机推荐

  • 如何在 iOS 7 中向全屏 VC 添加自定义导航栏并使其与状态栏相匹配?

    在我正在开发的应用程序 Xcode 5 gt iOS 7 自动布局 中 我推送了一个模式视图控制器 我希望模态视图控制器有一个导航栏 所以我添加了一个 并添加了一个约束 将其顶部与顶部布局指南对齐 因此它放置在状态栏的正下方 我使用自己的导
  • 读取共享库中的文件 Xamarin C#

    我在共享库中保存了一些 json 文件 我已经成功地通过代码在 iOS 中很好地阅读了 string fileName Files file name json var path Path Combine NSBundle MainBund
  • Firebase RecaptchaVerifier.clear() 无效

    我有一个 React Web 应用程序 我想在其中实现电话身份验证 我已经根据文档和示例初始化了 recaptchaVerifier 但是 如果我想再次提交表单 比如因为错误 我收到错误 Error reCAPTCHA has alread
  • Angular2 组件在循环中渲染 2 个 tr 元素

    我需要编写一个具有如下模板的组件 tr tr tr tr 这必须与 ngFor 一起使用来创建表 组件的选择器是spot row 该组件有一个名为的输入变量spot 所需的输出必须如下所示 table tbody tr tr tr tr t
  • sql 只获取表中的第一个记录行,我想要所有

    有人已经帮助我解决了这个查询 但我进行了调整 但遇到了问题 SELECT AVG tyd price AS avg price COUNT tyd id product AS cnt tyd id marchand tyd id produ
  • 以编程方式捕获 HOME 意图

    我需要我的活动来处理 HOME 按钮的按下 以编程方式接收器 但事件未触发 我可以 但是 如果我成功注册并捕获此意图过滤器 在manifest xml 活动部分中声明它 这是代码 接收器不工作 BroadcastReceiver br br
  • 控制器未过滤 DotNetNuke 模块中 Breeze 查询中的数据

    我试图将基本的 Breeze 示例包含在 DotNetNuke 模块中 它在独立的 WebAPI 项目中工作正常 为了简化操作 我删除了客户端 仅引用我在 Chrome 浏览器中进行的 URL JSON 调用 我可以看到我的元数据和完整的项
  • 如何在数码显微照片脚本中使用单个对话框打开多个图像?

    我正在用 DigialMicrograph 脚本编写 我想要一个脚本在一个对话框中打开多个图像 即一个多选图像对话框 类似于您进入任何 Windows 打开对话框 选择多个图像并按 确定 我认为这是可能的 但我还没有找到办法 我想在我的脚本
  • 获取 NoSuchFieldError 实例 org/apache/http/message/BasicHeaderValueParser

    我正在开发 Android 上的应用程序 我正在使用httpcore 4 3 3 当我尝试使用时我得到这个ContentType parse string java lang NoSuchFieldError No static field
  • 所有的无限循环都是不好的吗?

    出于好奇 有all无限循环不好 如果运行无限循环会产生哪些不良影响和后果 另外 如果它们并不全是坏事 您能否举一些例子 说明它们何时能发挥有意义的作用 他们需要有什么东西来关闭实例吗 例如 我们总是在 Java 中使用 StreamRead
  • 有没有办法从 MassTransit 获取原始消息?

    我有一个具有通用参数的消费者IEvent 该类型是所有消息的基接口 以及子接口IEvent还有一些其他属性 我希望能够访问具有嵌套类型的所有属性的原始消息 而不仅仅是IEvent范围 这些属性可以通过 RMQ 管理仪表板查看 我认为应该有一
  • Powershell Invoke-Webrequest 在没有表单的情况下进行页面登录

    I saw 这个帖子没有解决方案 但我的问题是类似的 我正在尝试在我自己的登录页面上自动查找我正在使用的服务的一些信息 当我运行以下命令时 它没有给我任何信息 Forms Webpage Invoke WebRequest Uri http
  • Python pandas:读取带有多个表重复前导码的csv

    有没有一种Python式的方法来找出CSV文件中的哪些行包含标题和值以及哪些行包含垃圾 然后将标题 值行放入数据框中 我对 python 比较陌生 一直使用它来读取从科学仪器的数据日志导出的多个 CSV 到目前为止 在处理其他任务的 CSV
  • Modbus 错误:[输入/输出] 未收到来自远程设备的响应

    我尝试从 Mac 笔记本电脑连接到 Modbus 设备 MR SI4 使用串行连接 使用 USB RS485 转换器 安装 到 dev cu SLAB USBtoUART 这是我的代码 import logging logging basi
  • 如何通过bundle发送对象

    我需要传递对通过包进行大部分处理的类的引用 问题是它与意图或上下文无关 并且具有大量非原始对象 如何将类打包成可打包 可序列化并将其传递给startActivityForResult 您还可以使用 Gson 将对象转换为 JSONObjec
  • querydsl生成的q源代码未正确导入

    我正在尝试将 querydsl 添加到现有系统 但在获取生成的 Q 源进行编译时遇到问题 我读过几个类似的问题和解释 https spring io blog 2015 09 04 what s new in spring data rel
  • Lucene 搜索匹配短语中的任何单词

    我想搜索包含很多单词的字符串 并检索与其中任何单词匹配的文档 我的索引方法如下 Document document new Document document add new TextField termos text Field Stor
  • 使用 GridF 从 mongoDB 读取和显示图像

    我已经能够使用 GridFs 成功将图像上传到 mongoDB 以下是我的数据库中的图像 fs 文件 fs 块 下面是我用来上传图片的代码 var Grid require gridfs stream var mongoose requir
  • Ionic 4. NavParams 的替代方案

    我正在使用 ionic 4 它不接受使用 navparams 接收数据 这是我的发件人页面方法 private route Router gotoFinalView intent this route navigateByUrl inten
  • 3 次划分的中位数

    我找到了以下代码 用于使用第一个 最后一个和中间元素的中值查找快速排序的枢轴 int middle low high 2 if a middle compareTo a low lt 0 swapReferences a low middl