Algorithm 基数排序在Lua中不起作用

Algorithm 基数排序在Lua中不起作用,algorithm,sorting,lua,radix-sort,Algorithm,Sorting,Lua,Radix Sort,首先,我应该提到我的代码编写时间并不长,尽管从我的代码中可以明显看出这一点:p 我有两个问题,首先排序功能不正常,但确实按长度对数字进行排序。这里的任何帮助都将不胜感激 其次,它同时改变了它获取的表和它返回的表(不知道为什么)。我如何防止它改变它抓住的桌子 我更希望人们不要发布一个完全优化的预制代码,因为我不会以这种方式学习或理解任何东西 function radix_sort(x) pass, bucket, maxstring = 0, x, 2 while true do

首先,我应该提到我的代码编写时间并不长,尽管从我的代码中可以明显看出这一点:p

我有两个问题,首先排序功能不正常,但确实按长度对数字进行排序。这里的任何帮助都将不胜感激

其次,它同时改变了它获取的表和它返回的表(不知道为什么)。我如何防止它改变它抓住的桌子

我更希望人们不要发布一个完全优化的预制代码,因为我不会以这种方式学习或理解任何东西

function radix_sort(x)

   pass, bucket, maxstring = 0, x, 2 

   while true do

      pass = pass + 1
      queue = {}

      for n=#bucket,1,-1 do

         key_length = string.len(bucket[n])
         key = bucket[n]

         if pass == 1 and key_length > maxstring then
            maxstring = key_length
         end

         if key_length == pass then
            pool = string.sub(key, 1,1) 

            if queue[pool + 1] == nil then
               queue[pool + 1] = {}
            end 

            table.insert(queue[pool + 1], key)
            table.remove(bucket, n)
         end
      end

      for k,v in pairs(queue) do
         for n=1,#v do
            table.insert(bucket, v[n])
         end            
      end

      if pass == maxstring then
         break
      end
   end

   return bucket
end

总是看着第一个角色;也许你的意思是
string.sub(key,pass,1)

我做了很多更改,希望你能仔细查看并了解它们。我尽可能地发表评论

函数基数排序(x)
通过,maxstring=0,0
--为了避免覆盖x,像这样复制到bucket中
--它还提供了初始化maxstring的机会
bucket={}
对于n=1,#x,1 do
--因为我们可以将下面的字符串函数的所有条目转换为字符串
bucket[n]=tostring(x[n])
key_length=string.len(bucket[n])
如果键长度>maxstring,则
maxstring=键长度
结束
结束
--不喜欢“while true…break”,因为我们可以在这里设置条件

而传递表总是通过引用传递。要制作只读表,请参阅@mike,不客气。请务必单击最能解决问题的答案旁边的绿色复选标记,以便问题不再显示为打开状态。
        pool = string.sub(key, 1,1) 
> input={55,2,123,1,42,9999,6,666,999,543,13}
> output=radix_sort(input)
> for k,v in pairs(output) do
>   print (k , " = " , v)
> end
1    =  1
2    =  2
3    =  6
4    =  13
5    =  42
6    =  55
7    =  123
8    =  543
9    =  666
10   =  999
11   =  9999