Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 内置的排序算法怎么会这么快?_Sorting_Lua_Quicksort_Lua Table_Rosetta Code - Fatal编程技术网

Sorting 内置的排序算法怎么会这么快?

Sorting 内置的排序算法怎么会这么快?,sorting,lua,quicksort,lua-table,rosetta-code,Sorting,Lua,Quicksort,Lua Table,Rosetta Code,据说,快速排序是对列表/表格/任何内容中的数据进行排序的最快速算法之一。无论如何,rosettacode Lua是如何实现该算法的 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

据说,快速排序是对列表/表格/任何内容中的数据进行排序的最快速算法之一。无论如何,rosettacode Lua是如何实现该算法的

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
函数快速排序(t)
如果#t<2,则返回t end
局部轴=t[1]
局部a,b,c={},{},{}
对于ipairs(t)do中的v
如果v枢轴然后c[#c+1]=v
否则b[#b+1]=v
结束
结束
a=快速排序(a)
c=快速排序(c)
对于ipairs(b)中的v,执行a[#a+1]=v结束
对于ipairs(c)中的v,执行[#a+1]=v结束
归还
结束

与内置的
表相比,它的速度要慢得多(在一百万个条目表中对所有随机放置的条目进行排序大约需要一分钟)。sort(table)
算法,对同一个表进行排序只需要大约五秒钟?

内置的
表。sort
也使用快速排序算法。(见附件)


主要的区别是,内置的是用C编写的。虽然Lua与其他脚本语言相比速度快,但它仍然没有C快。

您应该将pivot设置为t[2],使我的编译器的性能加倍,但取决于您实现快速排序的方式,它可能会破坏它。

除了语言上的差异,Lua的内置
表。sort
就地修改目标表。您的实现返回一个新表,每个迭代步骤实例化3个新表。我想这就是大部分表演失败的地方。在对数百万项的数组进行排序时,这些额外的表分配会快速累积

更恰当的比较是就地快速排序:


请注意,如果无法修改输入表,则将其复制到一个牺牲表中并对该表进行排序也将比“纯”实现更快。

Lua是解释语言,解释成本很高。当与本机代码进行比较时,请至少尝试使用LuaJIT进行相同的测试。快速排序在最佳和平均情况下为O(n logn),但在最坏情况下为O(n^2)。并不总是最快的算法。@Akshat Mahajan,这并不能解释效率上的巨大损失,如果我以另一个顺序重新创建表,我会得到同样的结果。@Vlad JIT编译器有什么变化?用C编写。它会更快。因此C比Lua快(这很有意义)。但是,C++如何?@ USS6245072 C++仍然会更快。您无法将脚本语言与编译语言进行比较。然而,有些东西,比如前面提到的LuaJIT编译器和Terra(),您可以使用它们来接近它们,因为它们在下面使用C。解释vs编译,而不是脚本vs编译。此外,Lua在解释方面甚至作为脚本语言也胜过Python。
local quicksort do
  local function qhelp(t, l, r)
    if r - l < 1 then return end
    local p = l
    for i = l + 1, r do
      if t[i] < t[p] then
        if i == p + 1 then
          t[p],t[p+1] = t[p+1],t[p]
        else
          t[p],t[p+1],t[i] = t[i],t[p],t[p+1]
        end
        p = p + 1
      end
    end
    qhelp(t, l, p - 1)
    qhelp(t, p + 1, r)
  end

  function quicksort(t)
    qhelp(t, 1, #t)
  end
end
local arr = { 1, 5, 2, 17, 11, 3, 1, 22, 2, 37 }
quicksort(arr)
print(table.concat(arr,","))