javascript - 排序锦标赛种子

标签 javascript sorting

我正在制作一个 HTML/JS 支持的单/双淘汰括号网络应用程序。我正在努力弄清楚如何从种子队/球员列表中分配第一轮比赛。例如,在 8 名选手的分组中,第一轮比赛是:

1v8 4v5 2v7 3v6

用更通用的术语来说,种子可以被认为是一个数组(因为我通过从数组中弹出来分配团队进行比赛): 1,2,3,4,5,6,7,8

需要分类为: 1,8,4,5,2,7,3,6

需要澄清的是,较高的种子在排序数组中需要具有最大的距离,这是为了在没有意外的括号中,较低的种子首先被淘汰,并且与高种子的匹配尽可能晚发生.实际上,想想一场网球锦标赛,你想要阻止 16 或 32 等组中的前 4 名选手在半决赛之前互相比赛。因此,16 种子括号的正确数组输出是:

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

转换为以下第一轮比赛:

1v16 8v9 4v13 5v12 2v15 7v10 3v14 6v11

感谢 Matt Ball 为 8 种子括号提供的正确算法

最佳答案

从上到下匹配玩家的思路是正确的,但还不够完善。做一次对第一轮非常有效:

while (seeds.length)
{
    firstRound.push(seeds.shift());
    firstRound.push(seeds.pop());
}
1, 2, 3, 4, 5, 6, 7, 8 => 1, 8, 2, 7, 3, 6, 4, 5

...但是在第二轮中,种子 1 遇到种子 2,种子 3 遇到种子 4。我们需要为每一轮进行第一次/最后一次洗牌。第一次,我们单独移动每个元素。第二次,我们移动每个 PAIR 元素。第三次,我们移动四人一组,等等,直到我们的组大小为seeds.length/2。像这样:

// this is ruby, aka javascript psuedo-code :)

bracket_list = seeds.clone

slice = 1
while slice < bracket_list.length/2
  temp = bracket_list
  bracket_list = []

  while temp.length > 0
    bracket_list.concat temp.slice!(0, slice)       # n from the beginning
    bracket_list.concat temp.slice!(-slice, slice)  # n from the end
  end

  slice *= 2
end
return bracket_list

下面是迭代过程中数组的样子(括号表示增加的组大小):

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

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

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

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

现在,在淘汰最后 8 名玩家后,我们剩下 1, 8, 4, 5, 2, 7, 3, 6。后 4 名被淘汰后,我们有 1, 4, 2, 3,在最后一轮只有 1, 2

如果不画括号就很难解释这个……如果我能为你澄清一些事情,请告诉我。

关于javascript - 排序锦标赛种子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5770990/

相关文章:

php - 双排序数组

javascript - 传递给自定义过滤器的数据未定义

javascript/html 自动刷新按钮

c++ - C++ 中的快速排序实现(失败测试)

sorting - 戈兰 : How to sort slices by days of the week?

java - 如何将 Vector<Vector<String>> 转换为 Object[][]?

javascript - 前端集成测试

javascript - 编辑路径点或线的选择

javascript - 我想使用一个下拉菜单,该菜单将使用 JavaScript 更改文档的 bgColor

javascript - jquery 停止对象排序