2016-04-24 9 views
2

Quicksort gilt als einer der schnellsten Algorithmen zum Sortieren von Daten innerhalb einer Liste/Tabelle/was auch immer. Wie auch immer, wie kommt die rosettacode Lua Implementierung dieses AlgorithmusWie kann der eingebaute Sortieralgorithmus so schnell sein?

function quicksort(t) 
    if #t < 2 then return t end 
    local pivot = t[1] 
    local a, b, c={}, {}, {} 
    for _, v in ipairs(t) do 
     if v < pivot then a[#a + 1] = v 
     elseif v > pivot then c[#c + 1] = v 
     else b[#b + 1] = v 
     end 
    end 
    a = quicksort(a) 
    c = quicksort(c) 
    for _, v in ipairs(b) do a[#a + 1] = v end 
    for _, v in ipairs(c) do a[#a + 1] = v end 
    return a 
end 

so viel langsamer ist (dauert etwa eine Minute alle zufällig platziert Einträge in einer eine Million Einträge Tabelle zu sortieren) im Vergleich zu den eingebauten in table.sort(table) Algorithmus, Wich dauert nur ungefähr fünf Sekunden, um die gleiche Tabelle zu sortieren?

+0

Lua Sprache interpretiert und Dolmetschkosten sind hoch. Versuchen Sie zumindest den gleichen Test mit LuaJIT beim Vergleich mit nativem Code. – Vlad

+0

Quicksort ist O (n log n) im besten und durchschnittlichen Fall, aber O (n^2) im schlimmsten Fall. Nicht immer genau der schnellste Algorithmus da draußen. –

+0

@Akshat Mahajan Noch immer erklärt dies nicht so viel Effizienzverlust, und ich bekomme ungefähr dasselbe Ergebnis, wenn ich die Tabelle in einer anderen Reihenfolge erstelle. – user6245072

Antwort

4

Der eingebaute table.sort verwendet auch einen schnellen Sortieralgorithmus. (Siehe its code)

Der wesentliche Unterschied ist, der eingebaute in einem in C. Obwohl Lua geschrieben wird, wird schnell im Vergleich zu anderen Skriptsprachen, es ist immer noch nicht so schnell wie C.

+0

Also C ist schneller als Lua (was sinnvoll ist). Aber was ist mit C++? – user6245072

+0

@ user6245072 C++ wird immer noch schneller sein. Sie können Skriptsprachen nicht wirklich mit kompilierten vergleichen. Es gibt jedoch Dinge wie den bereits erwähnten LuaJIT-Compiler und Terra (http://terralang.org/), die Sie verwenden können, um ziemlich nah zu kommen, da sie C darunter verwenden. – Rok

+0

Interpretiert vs kompiliert, nicht scripting vs kompiliert. Auch Lua schlägt Python auf der interpretierten Seite sogar als Skriptsprache. – user6245072