首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序算法

排序算法
EN

Stack Overflow用户
提问于 2012-05-30 07:16:49
回答 2查看 428关注 0票数 2

我需要创建一个根据卡片对进行排序的排序算法,例如,如果您有一个4JJQQ,那么它应该对QQJJ4进行排序。我尝试了许多不同的方法,但似乎很难把顺序弄对。我基本上有一系列的卡片,包括那只手。

EN

回答 2

Stack Overflow用户

发布于 2012-05-30 07:50:37

如果你的主要问题是比较像J这样的文字和像4这样的数字,那么就是你的解决方案。

它是什么:它是一种排序算法,适用于排序的可能值有限的情况。您创建了一个包含所有可能值的表,在扫描中,对表中相应行中更新相同值的每个文字的所有出现次数进行计数。然后,您所要做的就是使用它对原始数组进行排序,以适合您的偏好顺序。

优点:计数排序是一种比合并和快速排序等其他通用算法更快的算法(平均需要O(n)时间)。如果您确实有有限的可能值,那么我建议您使用它。

现在到了对它进行“成对”排序的部分,这是我不太理解的。您能说出以下测试用例"JJQJ4“和"JQ329”的预期答案是什么吗?

如果您的答案模式是按递减顺序排列的卡片对,则只需修改计数排序,使其首先填充偶数张牌。如果任何文字的剩余可用卡片为1或0,它将在最后填充它们。

JJQJ4和QJ923。

替代方案:

您提到,当两个字面值很明显是一对时,您希望跳过必须对它们进行比较。

文字的插入将被修改。

当你得到45JJQ的时候,

1)输入:4.进程:存储4作为播放器节点的rChld

2)输入:5。进程:将5存储为4的rChld

3)输入:j。进程:将J存储为rChld of 5

4)输入:j。J被存储为玩家节点的子节点(同样,以二叉树的方式,即,如果在lChld两对中已经存在一个字面量,则J将被存储为基于它是大还是小的字面量的左或右子节点)。

5)输入:q。进程:将Q存储为rChld of 5

要比较两张牌,首先成对地搜索最高的牌(最右边的子牌没有子牌)。您还可以轻松地计算配对的数量。在一般的二叉树中,您可能需要BFS或DFS。但由于您最多只能有2对,所以您可以很容易地做到这一点。如果lChld为空,则在rChild中重新搜索具有单卡的高卡。

注意:如果你真的在做一个类似于扑克的游戏,你可能也想要类似于3的东西。这可以通过在玩家节点的左子节点中存储“权重”来容纳在节点中。也就是说,如果J出现两次,权重为2,如果出现三次,权重为3,依此类推。

票数 2
EN

Stack Overflow用户

发布于 2012-05-30 07:40:03

如果类型= {A,K,Q,J,A,10..2} (可能是Java的enum ),其中A>K>Q>J> 10 > ... >2

然后,这样就可以了:

代码语言:javascript
复制
class Card implements Comparable<Card> {
  public TYPE ty;
  public Card(TYPE t) {
    ty = t;
  }
  public int compareTo(Card card) {
    return card.ty - ty; //you should rewrite this according to [1] rules
  }
}

排序:

代码语言:javascript
复制
Collections.sort(listOfCards); where listOfCards is a List<Card>.

1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10808024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档