用完全二叉樹定義勝者樹,前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,int b)
private
:
int maxsize; //
允許最**手數
int n; //
當前大小(外部結點數)
int lowext; //
最遠層外部結點數
int offset; //
按深度滿結點數(加1即為第1個外部結點)
int *t; //
勝者樹陣列
t *e; //
選手陣列
void play(int k,int lc,int rc,int(*winner)(int a,int
b));
};template
bool winnertree::initial(t *a, int size, int (*winner)(int a, int
b))
for(;i<=n;i+=2
) play((i-lowext+n-1)/2,i-1
,i,winner);
return
true;}
template
void winnertree::play(int k, int lc, int rc, int (*winner)(int a, int
b))
}template
bool winnertree::replay(int i, int (*winner)(int a, int
b))
else //
被選中結點的左兄弟是最後乙個內部結點
else
}t[k]=winner(lc,rc);
k/=2
;
for(; k>=1; k/=2
) t[k]=winner(t[2*k],t[2*k+1
]);}
template
void tournamentsort(t a,const
int left,const
int right)
}//最後a中貌似只是個1~size的序列,不是原數值的排列
錦標賽排序演算法 java版
今天在做遊戲的聯賽系統,假如有n 人報名參加聯賽,伺服器記錄下報名人數,並對這些人的戰鬥後的結果進行排序,決出前16強或者8強。網上找了下錦標賽排序演算法,內容真少。總結下 1 建樹 這裡說的建樹是建立一顆完全二叉樹。當參加排序的陣列不足2的n次冪,將其補足。直到滿足建立乙個完全二叉樹 2 當某結點...
錦標賽排序和堆排序
1964年,堆排序被提出,它改善了錦標賽排序的種種缺點。錦標賽排序 錦標賽排序,也稱為樹形選擇排序 tree selection sort 是一種按照錦標賽的思想進行選擇排序的方法。首先對n個記錄進行兩兩比較,然後優勝者之間再進行兩兩比較,如此重複,直至選出最小關鍵字的記錄為止。這個過程可 以用一棵...
錦標賽問題 遞迴
設有n位選手參加網球迴圈賽,n 2 k,迴圈賽共進行n 1天,每位選手要與其他n 1位選手比賽一場,且每位選手每天比賽一場,不能輪空,按一下要求為比賽安排日程,1 每位選手必須與其他n 1格選手格賽一場 2 每個選手每天只能賽一場 3 迴圈賽一共進行n 1天 請按此要求將比賽日程表設計成有n行和n ...