下面的**可以方便地根據所排序物件的id查詢物件的排名,且總體複雜度為o(n),使用的是插入排序思想,下面是lua**:
local playerlist = {} --
local playerranks = {} -- 已經排序列表
function printt(obj)
for key, val in pairs(obj) do
print("key:", key, val.dbid, "score:", val.score, "rank:", val.rank)
endprint("--------------------")
end-- 插入排序演算法
function updatescore(player, score)
if playerlist[player.dbid] == nil then
local unit = {}
unit.dbid = player.dbid
unit.score = 0
unit.rank = 0
playerlist[unit.dbid] = unit
endlocal single = playerlist[player.dbid]
single.score = single.score + score
if single.rank == 0 then
-- 新玩家
-- 找自己的位置
for key, val in pairs(playerranks) do
if single.score > val.score then
single.rank = key
break
endend
if single.rank > 0 then
table.insert(playerranks, single.rank, single)
-- 後面的重排
for i = single.rank + 1, #playerranks, 1 do
playerranks[i].rank = i
playerlist[playerranks[i].dbid].rank = i
endelse
-- 插入到最後
single.rank = #playerranks + 1
table.insert(playerranks, single)
endelse
-- 舊玩家
-- 排名在第二名之後的才需要處理
if single.rank > 1 and single.score > playerranks[single.rank - 1].score then
table.remove(playerranks, single.rank)
for j = single.rank - 1, 1, -1 do
if single.score > playerranks[j].score then
playerranks[j].rank = playerranks[j].rank + 1 -- 依次後退一位
playerlist[playerranks[j].dbid].rank = playerranks[j].rank -- 被移動玩家的新排名
if j == 1 then
single.rank = 1
table.insert(playerranks, 1, single)
endelse
-- 找到了合適的位置
single.rank = j + 1
table.insert(playerranks, j + 1, single)
endend
endend
endlocal player1 =
updatescore(player1, 5)
local player2 =
updatescore(player2, 6)
local player3 =
updatescore(player3, 3)
local player10 =
updatescore(player10, 10)
updatescore(player1, 10)
updatescore(player2, 10)
local player8 =
updatescore(player8, 8)
updatescore(player2, 8)
printt(playerlist)
printt(playerranks)
插入排序演算法 時間複雜度
1.插入排序演算法 void sortt int a,int length 插入排序演算法 a j 1 temp 2.演算法的時間複雜度 我們假設計算機執行一行基礎 需要執行一次運算。int afunc void 那麼上面這個方法需要執行 2 次運算 int afunc int n for int ...
排序演算法 插入排序的時間複雜度分析
插入排序的原理是,將陣列分為已排序區間和未排序區間兩部分,從未排序區間中依次取元素跟已排序區間的元素一一對比,找到適合插入的位置。拿陣列 4,5,6,1,3,2 來舉例,如圖所示是排序的 過程。這個過程比上邊的原理詳細的多,本以為可以按照原理來寫出插入排序的 嘗試了幾次發現原理的資訊量並不足以寫出來...
插入排序複雜度為什麼不是nlog n
插入排序是一種很基本的排序,其複雜度為o n2 在大一學程式設計時沒有多想,為什麼不能利用二分查詢改進為o nlogn 呢 我們都知道插入排序就是在已有的序列上不斷地插入新的元素,我們都知道二分查詢的時間複雜度是o logn 二分查詢的條件就是序列必須是有序的。而剛好可以用在插入排序的過程中使用,這...