錦標賽排序演算法 java版

2021-06-01 00:54:30 字數 1602 閱讀 8667

今天在做遊戲的聯賽系統,假如有n 人報名參加聯賽,伺服器記錄下報名人數,並對這些人的戰鬥後的結果進行排序,決出前16強或者8強。

網上找了下錦標賽排序演算法,內容真少。總結下:

1:建樹:這裡說的建樹是建立一顆完全二叉樹。當參加排序的陣列不足2的n次冪,將其補足。直到滿足建立乙個完全二叉樹

2:當某結點的比較對手的參選標誌為「不再參選」,該結點自動公升入雙親結點,此動作不計入排序碼比較次數。每次比較出來的第一名都標記為不參賽。

3:最終結果是返回到原來的陣列之中

4:堆排序,資料很多,不多說。

/**

* 聯賽系統分組

* * @author administrator

*/public class competition

/*** 建立一顆樹

* @param a

* @param n

*/public static void tournamentsort(player player, int n)

int j = 0; // 在陣列player中取資料指標

for (int i = loadindex; i < treesize; i++) // 複製資料

else

// system.out.println(tree[i].getindex()+" "+ tree[i].getdata());

} int i = loadindex; // 進行初始比較尋找最小的項

while (i != 0)

i = (i - 1) / 2; // i退到雙親, 直到i=0為止

// system.out.println(tree[(j - 1) / 2].getindex() + " "

// + tree[(j - 1) / 2].getdata());

} for (i = 0; i < n - 1; i++)

player[n - 1] = tree[0].getdata();

system.out.println(player[n - 1]);

// return tree;

} /**

* 每次比較出勝者之後,更新得到下一次比較的勝者

* i是表中當前最小元素的下標, 即勝者。從它開始向上調整。

* @param tree

* @param i

*/public static void updatetree(tournamentplayer tree, int i) // 非空者上公升到雙親結點

else // 比賽對手都不為空

}} /**

* 得到最接近且大於

* number的2的n的方

* @param number

* @return

*/public static int nearestpoweroftwo(int number)

public static void main(string args)

public player getplayerarray()

public void setplayerarray(player playerarray)

}

演算法 排序(2)錦標賽排序

用完全二叉樹定義勝者樹,前n 1個結點t 1 t n 1 為內部結點 勝者 後n個結點e 1 e n 是參賽者。t陣列存的是參賽者編號,即e t 0 才是最終勝者的值 t 1 並沒有改變 int winner const int winner int i const int winner int a...

錦標賽排序和堆排序

1964年,堆排序被提出,它改善了錦標賽排序的種種缺點。錦標賽排序 錦標賽排序,也稱為樹形選擇排序 tree selection sort 是一種按照錦標賽的思想進行選擇排序的方法。首先對n個記錄進行兩兩比較,然後優勝者之間再進行兩兩比較,如此重複,直至選出最小關鍵字的記錄為止。這個過程可 以用一棵...

錦標賽問題 遞迴

設有n位選手參加網球迴圈賽,n 2 k,迴圈賽共進行n 1天,每位選手要與其他n 1位選手比賽一場,且每位選手每天比賽一場,不能輪空,按一下要求為比賽安排日程,1 每位選手必須與其他n 1格選手格賽一場 2 每個選手每天只能賽一場 3 迴圈賽一共進行n 1天 請按此要求將比賽日程表設計成有n行和n ...