[VIEW]成績龍虎榜(Ranking List),排序算法 with PHP

62 篇文章 0 订阅
44 篇文章 0 订阅

賽規:


聯賽兩個循環後積分最高之球隊為總冠軍,如有同分,則先以雙方對賽成績計算勝負(即兩勝對手或一勝一和);但雙方如各勝一場或兩場都賽和而未能分出高下,則以得失球差計算,多者為冠軍;如得失球差相同,則以入球較多者為冠軍;如入球數字亦相同,則須安排一場附加賽決定名次。



sorting-field



依照如上賽規進行排序的話,將無法使用PHP的array_multisort函數,因為其中第二項條件不是一個簡單的數據列,而是涉及到再次進行複雜的數據庫查詢。


所以只有第一次排序可以使用:


foreach($results as $res)
{
	$field[] = $res['points'];
}

array_multisort($field, SORT_DESC, $results);

由此得到一個根據‘積分’排序后的數組,之後的排序,需要通過自定義冒泡排序來完成。


1.首先判斷是否積分字段有重複


積分重複標誌=否
從 n 到 1
{
	(判斷第n個與第n-1個的積分是否相同)
	相同:{積分重複標誌=是;終止循環}
	不相同:{}
}

如果沒有重複,表明不需要再進行任何進一步的排序操作,排序工作至此完成。


如果有重複,則通過冒泡排序:


勝負重複標誌=否
指數 i 從 第n個 開始 到 第1個 結束
{
	指數 j 從第n個 開始, 到第n-i個 結束
	{
		(判斷是否第j個與第j-1個的‘積分’相同)
		相同:
		{
			
			查詢數據庫中兩個球隊比賽情況;
			(判斷是否兩支球隊排名應相同)
			不相同:{調轉兩個球隊次序或不調轉}
			相同:{給兩支球隊的‘勝負’字段賦值j,如果第j球隊已經擁有此‘勝負’字段並且有值x,那麼兩球隊都被賦值x;
					設定 勝負重複標誌=是}
		}
		不相同:
		{
			
		}
	}
	
	如果‘勝負重複標誌’仍為否,則終止循環
}


這樣,將會得到一個排序后的數組,該數組中,若兩個相鄰的元素的‘勝負’字段都有被賦值,並且相同,那麼這指示著應該要對它們進行進一步的排序,即根據‘得失球差’字段。


在進行根據‘得失球差’字段排序之前,可以先通過上一次冒泡排序中使用的‘勝負重複標誌’來判斷是否需要執行此操作,如果該變量的值為‘’,那麼說明並未遇見相鄰的元素有相同‘勝負’值,即表示不需要執行進一步排序。


之後的冒泡排序都是普通的冒泡排序。如果 ‘勝負重複標誌’為 ‘’,根據‘得失球差’排序:


得失球差重複標誌=否
指數 i 從 第n個 開始 到 第1個 結束
{
	指數 j 從第n個 開始, 到第n-i個 結束
	{
		(判斷是否第j個與第j-1個的‘積分’相同 並且 ‘勝負’相同)
		相同:
		{
			
			(判斷是否兩支球隊‘得失球差’相同)
			不相同:{調轉兩個球隊次序或者不調轉}
			相同:{	設定 得失球差重複標誌=是}
		}
		不相同:
		{
			
		}
	}
	
	如果‘得失球差重複標誌’仍為否,則終止循環
}


如果 ‘得失球差重複標誌’為 ‘’,根據‘得球’排序:



得球重複標誌=否
指數 i 從 第n個 開始 到 第1個 結束
{
	指數 j 從第n個 開始, 到第n-i個 結束
	{
		(判斷是否第j個與第j-1個的‘積分’相同 並且 ‘勝負’相同  並且 ‘得失球差’相同)
		相同:
		{
			
			(判斷是否兩支球隊‘得球’相同)
			不相同:{調轉兩個球隊次序或者不調轉}
			相同:{	設定 得球重複標誌=是}
		}
		不相同:
		{
			
		}
	}
	
	如果‘得球重複標誌’仍為否,則終止循環
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值