锦标赛排序cppm

2025-06-03 · 490 人浏览
// Date:      2026-04-29
// Author:    www.xinweikaoyan.com
// Compiler:  GCC 15.2
// Target:    Ubuntu 24.04.1 LTS (x86_64)
// Standard:  C++26 with modules

export module tournament_sort;
import std;
using Rank = std::size_t;

// 胜者树节点结构
struct Node {
    int value { };   // 存储的值
    Rank rank { };   // 在原始向量中的位置(用于保持稳定性)
    auto operator<=>(const Node&) const = default; // 生成所有比较运算符(先比value,后比rank)
};

void update_parent(std::vector<Node>& tournament_tree, const Rank parent_rank){
    auto [lchild_rank, rchild_rank] = std::pair{ 2 * parent_rank + 1, 2 * parent_rank + 2 };
    tournament_tree[parent_rank] = std::min(tournament_tree[lchild_rank], tournament_tree[rchild_rank]);
}

std::vector<Node> build_tournament_tree(const std::vector<int>& arr, const Rank n) {
    std::vector<Node> tournament_tree(2 * n - 1);
    // 初始化叶子节点
    for (Rank i { 0 }; i < n; i++){
        tournament_tree[n - 1 + i] = {arr[i], i};
    }
    // 初始化分支节点
    for (Rank i { 0 }; i < n - 1; i++) {
        const Rank parent_rank = n - 2 - i;
        update_parent(tournament_tree,parent_rank);
    }
    return tournament_tree;
}

// 锦标赛排序实现
export void tournament_sort(std::vector<int>& arr) {
    const Rank n {arr.size()};
    if (n < 2) return;
    
    std::vector<Node> tournament_tree = build_tournament_tree(arr, n);
    
    // 排序阶段
    for (Rank i { 0 }; i < n; i++) {
        // 当前最小值赋值给arr[i]
        arr[i] = tournament_tree[0].value;       
        // 定位到对应的叶子节点并标记为"淘汰"
        Rank node_rank {tournament_tree[0].rank + n - 1};
        tournament_tree[node_rank].value = std::numeric_limits<int>::max();
        
        // 向上调整胜者树
        while (node_rank > 0) {
            node_rank = (node_rank - 1) / 2; 
            update_parent(tournament_tree, node_rank);
        }
    }
}
Theme Jasmine by Kent Liao