乙個總體複雜度為O n 的插入排序演算法

2021-09-26 04:03:42 字數 2311 閱讀 1562

下面的**可以方便地根據所排序物件的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 二分查詢的條件就是序列必須是有序的。而剛好可以用在插入排序的過程中使用,這...