棋牌类游戏算法–牌分类

毫无疑问,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);}}
参考: Resort.me博客上的快速排序–我们JCG合作伙伴 Arun Manivannan的3向和双向旋转 。

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

棋牌类游戏算法–牌分类

棋牌类游戏算法–牌分类_快速分类–三向和双枢轴相关推荐

  1. 斗地主棋牌类游戏中的洗牌和发牌算法

    前言 洗牌和发牌是棋牌类游戏中,非常重要的两个关键节点,而这两个关键节点涉及的算法,很多同学非常感兴趣,今天,我们就以NodeJS环境为例,通过JS代码给大家解说洗牌和发牌算法. 一. 洗牌算法 1. ...

  2. 棋牌类游戏服务器架构全面总结

    一.棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间 ...

  3. 使用Delphi编写棋牌类游戏 – 设计篇(3)

    最近几天正在找工作,所以更新BLOG晚了一些.今天在老婆的催促下终于要更新了. 通过以上两篇关于对中心服务器和登录服务器设计的阐述,大家应该对设计它们有了一定的了解.但是中心服务器和登录服务器毕竟是游 ...

  4. C# 写的棋牌类游戏(全源码)。

    C# 写的棋牌类游戏(全源码) http://d.namipan.com/d/b47c1bb0ed558e95c85313ba845e57ddad98b70568aa6704 有兴趣的开发者可以下载看 ...

  5. 棋牌类游戏的开发心得

    一个多人在线的棋牌类网络游戏的项目临近尾声,我参与了该项目的整个设计流程,并且完成了90%的核心代码.关于这个项目,有很多地方值得聊一聊.本系列不打算把这个项目将得多么详细规范,那是设计文档应该描述的 ...

  6. 三维重建_快速分类–三向和双枢轴

    三维重建 毫无疑问,Quicksort被认为是本世纪最重要的算法之一,而且它是许多语言的事实上的系统排序,包括Java中的Arrays.sort . 那么,quicksort有何新变化? 好吧,除了我 ...

  7. 巨人网络305亿并购海外棋牌类游戏公司审核遭暂停

    雷帝网 乐天 8月10日报道 巨人网络今日发布公告,宣布2018年8月10日收到中国证监会通知,决定对公司本次发行股份及支付现金购买资产并募集配套资金暨关联交易事项(简称"本次重组" ...

  8. php实现棋牌房间,App房卡棋牌类游戏也有了一键进入房间的神操作!

    APP房间类游戏,要想有竞争力,关键就在于下载安装方便和进入游戏房间方便--其实就是拉朋友方便,这样才能够更快发展用户量和改善用户消费时的体验.减少在多个中转环节中的损耗以增加用户的消费时长. 这些方 ...

  9. 噬血代码进不了游戏_玩家认可,二次元魂类游戏,《噬血代码》在三个方面做出了差异化...

    昨天(9月29日)博士和大家分享了文章<灵魂正在燃烧,前IGN编辑暗示了<恶魔之魂>重制版的存在>,讲述了业内人士爆料:索尼实际上已经完成了<恶魔之魂>重制版的制作 ...

最新文章

  1. 蚂蚁金服-支付风险识别亚军方案!
  2. Docker不再是唯一的选择
  3. 探索 20 年,依然难落地,是谁阻止了教授们的「学术休假」?
  4. matlab pdist函数官方详解
  5. crackme 逆向寒假生涯(22/100)
  6. 服务器升级中不能修改,windows10下更新服务器为何改不了了
  7. 新建学生类,分别计算3个科目的总和
  8. ng-template 使用过程中参数传递错误的单步调试
  9. 简述大数据的数据管理方式_智能销售服务商荣登TOP100榜,大数据线上获客方式再得认可...
  10. java io系列09之 FileDescriptor总结
  11. linux-目录查询命令-目录内容查看-ls查询-tree查询-查询类容分类-不同颜色对应不同类型
  12. css如何设置文本垂直居中显示,css中怎么设置文本居中?css文本垂直居中的设置方法...
  13. ZIP压缩输入/输出流
  14. 自动选择阈值--最大类间方差法(OTSU)原理及matlab实现
  15. 我在舒舍的短租生活之旅
  16. python测量镜头到目标距离,如果从相机(校准)到我的物体的距离是固定的,我如何测量物体的宽度?...
  17. 登机牌,机票,行程单的区别
  18. c 循序结构程序设计
  19. 微信端视频播放时防止被浏览器劫持的问题
  20. java class.getmethod_java 反射使用 Class.getMethod 应注意

热门文章

  1. Hadoop生态hive(二)安装
  2. Hadoop入门(十八)Mapreduce的倒排索引程序
  3. JavaFX UI控件教程(六)之Toggle Button
  4. JavaFX UI控件教程(五)之Radio Button
  5. MySQL substring()函数
  6. JVM内存管理------垃圾搜集器参数精解
  7. Java 面试题经典 77 问
  8. 使用ListView控件展示数据
  9. 当当网头部和尾部——CSS源码
  10. 面试项目 java-服务端 18h58