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

2022-07-05 11:36:18 字數 1673 閱讀 6512

用完全二叉樹定義勝者樹,前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 ...