lua中對table的排序

2021-07-30 16:51:42 字數 2405 閱讀 4478

lua中對table的排序一般是用lua自帶的table.sort()函式排序,一般不採用自己寫的排序的方式,以下來說一說

table.sort()排序和在工作中遇到的問題 

1.排序的方式

table.sort(tbl,function(a,b)

return

a > b

end)

以上是乙個簡單的例子,得到的效果是對於待排序的資料的乙個公升序,你這樣認為就是錯了,例如a和b是乙個樣

的,返回的是false,是乙個不嚴格的公升序,嚴格的說可以是乙個非降序排列。 

對於lua中的排序,最好是用lua自帶的函式,不要自己造輪子,自己寫乙個排序的函式

在排序的時候應該是嚴格弱序,用小於關係。

正確的排序應該滿足的條件,才能得到結果 

1)反自反性

cmp(a, a) === false
就是在寫的排序的實現中,自己和自己比較,要永遠是false 

2)非對稱性

cmp(a, b) == true ==> cmp(b, a) == false
就是a和b比較得到的是true,那麼b和a比較得到的就是false,否則就不成立 

3)傳遞性

cmp(a, b) == true && cmp(b, c) == true ==> cmp(a, c) == true
不可比的傳遞性 

就是說a和b之間成立,b和c之間成立,那麼a和c之間也要成立,才能達到傳遞性

如cmp(a,b) 

a == b + 1 這個就是不成立的 

如果存在這樣的cmp(a, b) == true && cmp(b, c) == true,那麼就假設a = 2,b = 1,c = 0 

但是cmp(a, c)就不成立了,所以這個排序是不能成功的

注:table.sort(list,function(a,b) 

end)在這裡面不需要去判斷a,b是否存在,他們是一定存在的,它是list中的資料,所以一定是存在的。

二:多個條件的比較 

在一些需求當中,比較的資料不是乙個,是組合的形式出現的,先是比較欄位a,如果相等再比較欄位b,那麼在

處理這樣的例項當中,有以下的幾種方式 

1)

function(a, b)    

return

a.level > b.level or

a.level == b.level and

a.exp > b.exp

end

2)

function(a, b)    

ifa.level == b.level then

return

a.exp > b.exp

end return

a.level > b.level

end

3)

function(a, b)

ifa.level ~= b.level then

return

a.level > b.level

endreturn

a.exp > b.exp

end

這三種方法當中,第三種是最好的,因為它具有很大的延展性,如果以後比較的是三個或者是三個以上的字段,

那麼直接在後面新增就是,第二種的話,就是要倒序的去比較,講比較的字段分成比較的先後順序為1,2,3,4.

那麼按照第二種的話,就先去判斷4是否相等,然後依次是3,2是否相等。不好理解

三:排序與最值 

對於不同的排序方式,演算法得到的效果不同,那麼就要考慮一下演算法的複雜度。 

任意table 線性查詢最值 o(n) 

排序 o(nlgn) 

只需要最值且陣列規模不小的時候不排序

四:多次排序 

由於在現實的例子中,可能對於要排序的條件不止乙個,是兩個或者是兩個以上的時候,需要在乙個函式中,一

次性排完。 

排序的穩定性: 

快排不具備穩定性,所以不可以按照條件順序多次排序 

多次排序效率也不高

五:隨機排序(shuffle) 

對於隨機排序就是對於一些資料,將他們的順序打亂,得到乙個新的資料,以下是乙個簡單的例子

function

i3k_shuffle(tbl)

local n = #tbl

for i = 1, n do

local j = math.random(i, n)

if j > i then

tbl[i], tbl[j] = tbl[j], tbl[i]

endend

end

Lua中對table排序例項

這篇文章主要介紹了lua中對table排序例項,本文講解了lua中對table的一般排序方法 針對值的排序 同時對鍵值進行排序等方法,需要的朋友可以參考下 lua中利用到的排序的基本上就是建構函式 table 了,為了便於和c區分開來,我俗稱它為表單。例項 原理就是lua整合的冒泡演算法 排序的一般...

lua對table排序,鍵值排序法

skillgroup 102 103 104 for i in pairs skillgroup do print 直接輸出 i end 直接獲取table的資料進行遍歷發現資料不像list那樣是直接索引取出排序好的,下面進行排序 插入key local keytest for i in pairs...

LUA中table的排序問題

畢業了,正式工作了,隨便寫寫。目前在實習,接觸的是u3d遊戲開發,設計到語言有erlang,c lua。最近在做揹包的排序的時候遇到的乙個小問題就貼出來了。檢視官方文件 第乙個引數是乙個table,第二個引數是外部函式,如下 table.sort showlist,sortfunc local fu...