三维重建

毫无疑问,Quicksort被认为是本世纪最重要的算法之一,而且它是许多语言的事实上的系统排序,包括Java中的Arrays.sort

那么,quicksort有何新变化?

好吧,除了我现在(在Java 7发行了2年之久之后)才想到, Arrays.sort的Quicksort实现已被称为Dual-Pivot QuickSort的变体替代。 出于这个原因,这个线程真棒,而且乔恩·本特利和约书亚·布洛赫真的很谦虚。

接下来我要做什么?

就像其他所有人一样,我想实现它并针对约1000万个整数(随机和重复)进行一些基准测试。

奇怪的是,我发现以下结果:

随机数据:

  • 快速排序基本:1222毫
  • 快速排序3种方式:1295毫秒(严重!)
  • 快速分类双枢轴:1066毫秒

重复数据:

  • 快速排序基础:378毫秒
  • 快速排序3种方式:15毫秒
  • 快速分类双枢轴:6毫秒

愚蠢的问题1:

恐怕在三向分区的实现中缺少一些东西。 在针对随机输入(1000万个)的数字进行的多次运行中,我可以看到单个枢轴始终表现更好(尽管对于1000万个数字,其差异小于100毫秒)。

我知道直到现在,将三路Quicksort设置为默认Quicksort的全部目的是它不会在重复键上提供0(n 2)性能-当我对重复输入运行它时,这一点非常明显。 但是,为了处理重复数据,三路方式会付出一点代价吗? 还是我的实现不好?

愚蠢的问题2

我的Dual Pivot实现(下面的链接)不能很好地处理重复项。 它需要永远的甜蜜(0(n 2))才能执行。 有避免这种情况的好方法吗? 谈到Arrays.sort实现,我发现在完成实际排序之前,就消除了升序和重复项。 因此,作为一个肮脏的解决方法,如果枢轴相等,则我快进lowerIndex,直到它与pivot2不同。 这是公平的实施吗?

else if (pivot1==pivot2){while (pivot1==pivot2 && lowIndex<highIndex){lowIndex++;pivot1=input[lowIndex];}}

而已。 那就是我所做的一切?

我总是发现算法的跟踪很有趣,但是由于Dual Pivot quicksort中的变量数量众多,我的眼睛在调试时发现它不知所措。 因此,我还继续创建了启用跟踪的实现(针对所有3种实现),以便可以看到变量指针当前所在的位置。

这些启用了跟踪的类仅覆盖指针在数组值下方的位置。 我希望您发现这些课程有用。

例如。 用于Dual Pivot迭代

整个项目(以及DSA的一些la脚实现)可在github上找到。 仅 在这里可以 找到quicksort类。

这是我对SinglePivot(Hoare),3way(Sedgewick)和新Dual-Pivot(Yaroslavskiy)的实现

单枢轴

package basics.sorting.quick;import static basics.sorting.utils.SortUtils.exchange;
import static basics.sorting.utils.SortUtils.less;
import basics.shuffle.KnuthShuffle;public class QuickSortBasic {public void sort (int[] input){//KnuthShuffle.shuffle(input);sort (input, 0, input.length-1);}private void sort(int[] input, int lowIndex, int highIndex) {if (highIndex<=lowIndex){return;}int partIndex=partition (input, lowIndex, highIndex);sort (input, lowIndex, partIndex-1);sort (input, partIndex+1, highIndex);}private int partition(int[] input, int lowIndex, int highIndex) {int i=lowIndex;int pivotIndex=lowIndex;int j=highIndex+1;while (true){while (less(input[++i], input[pivotIndex])){if (i==highIndex) break;}while (less (input[pivotIndex], input[--j])){if (j==lowIndex) break;}if (i>=j) break;exchange(input, i, j);}exchange(input, pivotIndex, j);return j;}}

3路

package basics.sorting.quick;import static basics.shuffle.KnuthShuffle.shuffle;
import static basics.sorting.utils.SortUtils.exchange;
import static basics.sorting.utils.SortUtils.less;public class QuickSort3Way {public void sort (int[] input){//input=shuffle(input);sort (input, 0, input.length-1);}public void sort(int[] input, int lowIndex, int highIndex) {if (highIndex<=lowIndex) return;int lt=lowIndex;int gt=highIndex;int i=lowIndex+1;int pivotIndex=lowIndex;int pivotValue=input[pivotIndex];while (i<=gt){if (less(input[i],pivotValue)){exchange(input, i++, lt++);}else if (less (pivotValue, input[i])){exchange(input, i, gt--);}else{i++;}}sort (input, lowIndex, lt-1);sort (input, gt+1, highIndex);}}

双枢轴

package basics.sorting.quick;import static basics.shuffle.KnuthShuffle.shuffle;
import static basics.sorting.utils.SortUtils.exchange;
import static basics.sorting.utils.SortUtils.less;public class QuickSortDualPivot {public void sort (int[] input){//input=shuffle(input);sort (input, 0, input.length-1);}private void sort(int[] input, int lowIndex, int highIndex) {if (highIndex<=lowIndex) return;int pivot1=input[lowIndex];int pivot2=input[highIndex];if (pivot1>pivot2){exchange(input, lowIndex, highIndex);pivot1=input[lowIndex];pivot2=input[highIndex];//sort(input, lowIndex, highIndex);}else if (pivot1==pivot2){while (pivot1==pivot2 && lowIndex<highIndex){lowIndex++;pivot1=input[lowIndex];}}int i=lowIndex+1;int lt=lowIndex+1;int gt=highIndex-1;while (i<=gt){if (less(input[i], pivot1)){exchange(input, i++, lt++);}else if (less(pivot2, input[i])){exchange(input, i, gt--);}else{i++;}}exchange(input, lowIndex, --lt);exchange(input, highIndex, ++gt);sort(input, lowIndex, lt-1);sort (input, lt+1, gt-1);sort(input, gt+1, highIndex);}}
参考:快速分拣–来自我们JCG合作伙伴Arun Manivannan的3向和双向枢轴,位于Rerun.me博客上。

翻译自: https://www.javacodegeeks.com/2013/06/quicksorting-3-way-and-dual-pivot.html

三维重建

三维重建_快速分类–三向和双枢轴相关推荐

  1. 棋牌类游戏算法–牌分类_快速分类–三向和双枢轴

    棋牌类游戏算法–牌分类 毫无疑问,Quicksort被认为是本世纪最重要的算法之一,并且它是许多语言的事实上的系统排序,包括Java中的Arrays.sort . 那么,quicksort有何新功能? ...

  2. 快速分类–三向和双枢轴

    毫无疑问,Quicksort被认为是本世纪最重要的算法之一,并且它是许多语言(包括Java中的Arrays.sort )的事实上的系统排序. 那么,quicksort有何新功能? 嗯,除了我现在(在J ...

  3. 姜敬哲/孙燕妮/原丽红合作开发可用于病毒快速分类的工具PhaGCN2

    南海水产研究所姜敬哲团队.香港城市大学孙燕妮团队.广东药科大学原丽红合作开发的可用于病毒快速分类生信工具 使用PhaGCN2对病毒基因组片段分类 Virus classification for vi ...

  4. 复习Java异常处理_异常分类_自定义异常_线程初步了解

    复习Java异常处理_异常分类_自定义异常_线程 主要内容 异常.线程 教学目标 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点 ...

  5. Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉...

    Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉 1.1. 按照当前流行的分类方法,可以分为以下三部分:三部分 图像处理 图像分析 计算机视觉1 1.2. 图像处理需要 ...

  6. 机器学习——概率分类(三)高斯概率密度与混合高斯模型

    机器学习--概率分类(三)高斯概率密度与混合高斯模型 在之前的文章机器学习--概率分类(一)朴素贝叶斯模型一文中,我们主要介绍了机器学习中的概率分类问题.我们提出了简单的朴素贝叶斯模型来进行概率密度的 ...

  7. excel输入公式显示公式_快速输入复杂的Excel公式

    excel输入公式显示公式 On Chandoo's blog, Hui is running a series of articles with Excel Tips. There were som ...

  8. matlab 画图 断层显示,MATLAB编程实现连续断层工业CT图像的三维重建_张爱东

    第26卷 第4期核电子学与探测技术 V ol.26 N o.4 2006年 7月Nuclear Electr onics &Detection T echnolo gy July 2006 M ...

  9. sql语言和php,SQL语言快速入门(三)_php

    我们日常使用SQL语言的工作过程中,使用最多的还是从已经建立好的数据库中查询信息.下面,我们就来详细介绍一下如何使用SQL语言实现各种数据库查询操作. SELECT-FROM 为方便讲解,我们在数据库 ...

最新文章

  1. Android CheckedTextView 实现单选与多选
  2. AIX如何查看文件系统分布在哪个物理磁盘上
  3. Java 洛谷 P1321 单词覆盖还原
  4. 【论文解读】让特征感受野更灵活,腾讯优图提出非对称卡通人脸检测,推理速度仅50ms...
  5. 为内置对象添加原型方法 把局部变量编程全局变量
  6. Java connot reduce_Java8: Reduce方法
  7. 动态规划——How to Type(hdu2577)
  8. 计算机病毒小学教师资格证面试,小学信息技术人教版四年级上册第15课《病毒防治及时做》优质课公开课教案教师资格证面试试讲教案...
  9. CentOS下apache绑定域名
  10. 操作系统原理学习总结
  11. 如果你热爱编码,就应该少写代码
  12. Halcon原理:auto_threshold算子
  13. word文档图片画红线_word文档怎么画线条
  14. 百度地图开发:Label文本居中
  15. 局域网、以太网、无线局域网学习笔记
  16. Intel VT学习笔记(八)—— 开启EPT
  17. mt管理器图片在哪个文件夹_微信apk用mt管理器 替换主界面背景图片是那个文件? 其他文件怎么替换 不要视频...
  18. 微众银行再次入驻微信小程序,人人可申请,66万人提额100亿,发福利啦!!!...
  19. WebRTC系列-Qos系列之接收NACK
  20. cordova app 监听物理返回键

热门文章

  1. 【python学习】模块random
  2. ADO读取EXCEL
  3. IT民工创业之殇---续1
  4. hadoop配置文件说明
  5. 《Windows核心编程》学习笔记(10)– 同步设备I/O与异步设备I/O
  6. SAP BPC最佳实践-SAP BPC的OLAP引擎比较(MS OLAPBW OLAP)
  7. golang 面向对象 简介
  8. golang map 判断key是否存在
  9. python flask 跨域问题 解决方法
  10. linux gcc make cmake 三工具的关系