luaにおけるtableのソート
6936 ワード
luaにおけるtableのソートは、一般にluaが持参するtableである.sort()関数のソートは、一般的には自分で書いたソート方式ではありません.
table.sort()ソートと作業中に発生する問題1.ソート方法 1 2 3 1 2 3
以上は簡単な例ですが、ソートされるデータの昇順については、aとbが同じように間違っていると思います.
は、falseを返し、厳密ではない昇順であり、厳密には非降順配列であってもよい.luaのソートについては、luaが持っている関数を使って、自分で車輪を作らないで、自分でソートの関数を書くのが一番です.
ソートするときは厳格な弱順で、小さい関係を使うべきです.
結果1)の反自己反転性を得るには,正しいソートが満たすべき条件である. 1 1
書く順序付けの実現において,自己と自己を比較し,常にfalse 2)非対称性である. 1 1
aとbを比較して得られるのがtrueであり,bとaを比較して得られるのがfalseであり,そうでなければ3)伝達性は成り立たない. 1 1
比類のない伝達性とは、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のデータなので、必ず存在します.
二:複数の条件の比較いくつかの需要の中で、比較するデータは1つではありませんて、組み合わせの形式で現れたので、先に比較フィールドaで、もし等しいならば更に比較フィールドb、それでは
このような例を扱うには,以下のような方式がある. 1 2 3 4 1 2 3 4
2) 1 2 3 4 5 6 1 2 3 4 5 6
3) 1 2 3 4 5 6 1 2 3 4 5 6
この3つの方法のうち、3つ目は最も優れています.それは大きな拡張性を持っているので、後で3つ以上のフィールドを比較すると、
では、直接後に追加すると、2つ目は、逆の順序で比較し、比較のフィールドを比較する順序は1、2、3、4です.
2つ目の場合は、まず4が等しいかどうかを判断し、3、2が等しいかどうかを判断します.理解しにくい
3:ソートと最値は異なるソート方式に対して、アルゴリズムが得た効果は異なり、アルゴリズムの複雑さを考慮しなければならない.任意table線形検索最値O(n)ソートO(nlgn)は、最値のみを必要とし、配列規模が小さくない場合はソートしません.
四:複数回ソート現実の例では、ソートする条件が1つ以上で、2つ以上の場合、1つの関数で、1つの関数で
二次的に並ぶ.並べ替えの安定性:速い並べ替えは安定性を備えていないため、条件の順序に従って何度も並べ替えても効率が高くない
五:ランダムソート(shuffle)ランダムソートはいくつかのデータに対して、彼らの順序を乱して、新しいデータを得て、以下は簡単な例です
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のデータなので、必ず存在します.
二:複数の条件の比較いくつかの需要の中で、比較するデータは1つではありませんて、組み合わせの形式で現れたので、先に比較フィールドaで、もし等しいならば更に比較フィールドb、それでは
このような例を扱うには,以下のような方式がある.
function(a, b)
return a.level > b.level or
a.level == b.level and a.exp > b.exp
end
2)
function(a, b)
if a.level == b.level then
return a.exp > b.exp
end
return a.level > b.level
end
3)
function(a, b)
if a.level ~= b.level then
return a.level > b.level
end
return a.exp > b.exp
end
この3つの方法のうち、3つ目は最も優れています.それは大きな拡張性を持っているので、後で3つ以上のフィールドを比較すると、
では、直接後に追加すると、2つ目は、逆の順序で比較し、比較のフィールドを比較する順序は1、2、3、4です.
2つ目の場合は、まず4が等しいかどうかを判断し、3、2が等しいかどうかを判断します.理解しにくい
3:ソートと最値は異なるソート方式に対して、アルゴリズムが得た効果は異なり、アルゴリズムの複雑さを考慮しなければならない.任意table線形検索最値O(n)ソートO(nlgn)は、最値のみを必要とし、配列規模が小さくない場合はソートしません.
四:複数回ソート現実の例では、ソートする条件が1つ以上で、2つ以上の場合、1つの関数で、1つの関数で
二次的に並ぶ.並べ替えの安定性:速い並べ替えは安定性を備えていないため、条件の順序に従って何度も並べ替えても効率が高くない
五:ランダムソート(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]
end
end
end