C++实现扑克牌红黑交替排列算法:寻求更简化解决方案
C++实现红黑交替排列扑克牌的简化方案
针对未排序的牌组,不需要先分离红黑牌再合并,直接通过一次遍历+双指针就能完成交替排列,逻辑更简洁,空间开销也更小。
核心思路
一副标准扑克牌红黑各26张,数量相等。我们可以直接在结果数组中给红黑牌分配固定的位置:
- 红牌放在偶数索引(0、2、4...),黑牌放在奇数索引(1、3、5...)(反之亦然,取决于你想要的起始颜色)
- 遍历原未排序牌组,用两个指针分别跟踪红黑牌的下一个目标位置,通过
if判断牌的颜色,直接放入结果数组对应位置,之后指针步进2。
代码实现
#include <vector> #include <iostream> // 定义花色枚举 enum class Suit { Heart, Diamond, Club, Spade }; // 扑克牌结构体 struct Card { Suit suit; int rank; // 牌面大小,1-Ace,11-Jack,12-Queen,13-King }; // 判断是否为红牌(红桃、方块为红) bool isRed(const Card& card) { return card.suit == Suit::Heart || card.suit == Suit::Diamond; } // 红黑交替排列函数:红牌起始,偶数位放红,奇数位放黑 void alternateRedBlack(std::vector<Card>& result, const std::vector<Card>& original) { result.resize(original.size()); int redPos = 0; // 红牌的下一个目标位置 int blackPos = 1; // 黑牌的下一个目标位置 for (const auto& card : original) { if (isRed(card)) { result[redPos] = card; redPos += 2; } else { result[blackPos] = card; blackPos += 2; } } } // 测试示例 int main() { // 构造一副乱序的测试牌组 std::vector<Card> originalDeck = { {Suit::Club, 5}, {Suit::Heart, 10}, {Suit::Spade, 3}, {Suit::Diamond, 7}, {Suit::Heart, 1}, {Suit::Spade, 12}, {Suit::Diamond, 9}, {Suit::Club, 13} }; std::vector<Card> sortedDeck; alternateRedBlack(sortedDeck, originalDeck); // 输出验证结果 std::cout << "交替排列后的牌组(红/黑标记):\n"; for (const auto& card : sortedDeck) { std::cout << (isRed(card) ? "[红]" : "[黑]") << " "; } std::cout << "\n"; return 0; }
关键细节
- 起始颜色调整:如果想要黑牌开头,只需交换
redPos和blackPos的初始值(redPos=1,blackPos=0)。 - 未排序牌组适配:不管原牌组顺序如何,只关注每张牌的颜色,直接分配到对应位置,无需提前排序或分类存储。
- 空间效率:仅需一个结果数组(大小与原牌组一致),不需要额外存储红黑两个子数组,比原方案节省一半的临时空间。
- 时间效率:一次遍历完成操作,时间复杂度为O(n),和原方案相同,但逻辑步骤更少。
内容的提问来源于stack exchange,提问作者angelxdeer
相关产品推荐
相关产品推荐

