get_ranks(a[1:n])
s ← array(n)
ranks ← array(n)
for i from 1 to n ▷ s[i] has record type
s[i] ← {position: i, value: a[i], rank: 0}
descending_sort(s by value) ▷ sort by s[i].value
s[1].rank ← 1
for i from 2 to n
if s[i].value < s[i-1].value ▷ dense rank
s[i].rank ← s[i-1].rank + 1
else
s[i].rank ← s[i-1].rank
for i from 1 to n ▷ construct result
ranks[s[i].position] ← s[i].rank
return ranks[]
?>
這個能滿足你的需求,但是我有一個問題, 兩個並列第一,考99那位不應該是第二名麼
題主想要的是按原數組順序顯示的排名(可並列)。大體思路是將原始數組補充上位置信息,然後按照排序的結果反向構建排名數組。寫出來比較囉嗦:
注意如果有多個並列第n,下一個將是第n+1名,這點與題主給出例子有點不同。整個演算法的複雜度瓶頸還是排序,即O(n lgn)。
用php本身的陣列排序函數?
先依照分數為這個陣列排序,然後再將這個陣列 revsert。然後按照分數取 key 就好了。
另外:你的分數不寫在資料庫裡,這樣拿出來本來就是有順序的啊