algorithmlanguage-agnosticbracketstournament

Tournament bracket placement algorithm


Given a list of opponent seeds (for example seeds 1 to 16), I'm trying to write an algorithm that will result in the top seed playing the lowest seed in that round, the 2nd seed playing the 2nd-lowest seed, etc.

Grouping 1 and 16, 2 and 15, etc. into "matches" is fairly easy, but I also need to make sure that the higher seed will play the lower seed in subsequent rounds.

An example bracket with the correct placement:

1 vs 16
            1 vs 8
8 vs 9
                        1 vs 4
4 vs 13
            4 vs 5
5 vs 12
                                    1 vs 2
2 vs 15
            2 vs 7
7 vs 10
                        2 vs 3
3 vs 14
            3 vs 6
6 vs 11

As you can see, seed 1 and 2 only meet up in the final.


Solution

  • I've come up with the following algorithm. It may not be super-efficient, but I don't think that it really needs to be. It's written in PHP.

    <?php
        $players = range(1, 32);
        $count = count($players);
        $numberOfRounds = log($count / 2, 2);
    
        // Order players.
        for ($i = 0; $i < $numberOfRounds; $i++) {
            $out = array();
            $splice = pow(2, $i); 
    
            while (count($players) > 0) {
    
                $out = array_merge($out, array_splice($players, 0, $splice));
                $out = array_merge($out, array_splice($players, -$splice));
    
            }            
    
            $players = $out;
        }
    
        // Print match list.
        for ($i = 0; $i < $count; $i++) {
            printf('%s vs %s<br />%s', $players[$i], $players[++$i], PHP_EOL);
        }
    ?>