Radix排序不适用于Lua

时间:2011-10-13 16:07:36

标签: algorithm sorting lua radix-sort

首先,我应该提一下,我的编码时间不长,尽管从我的代码中可能很明显: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

2 个答案:

答案 0 :(得分:2)

我为实现这项工作做了很多改变,所以希望你能看到并接受它们。我尽力发表评论。

function radix_sort(x)

   pass, maxstring = 0, 0 

   -- to avoid overwriting x, copy into bucket like this
   -- it also gives the chance to init maxstring
   bucket={}
   for n=1,#x,1 do
      -- since we can, convert all entries to strings for string functions below
      bucket[n]=tostring(x[n])
      key_length = string.len(bucket[n])
      if key_length > maxstring then
         maxstring = key_length
      end
   end

   -- not a fan of "while true ... break" when we can set a condition here
   while pass <= maxstring do

      pass = pass + 1

      -- init both queue and all queue entries so ipairs doesn't skip anything below
      queue = {}
      for n=1,10,1 do
         queue[n] = {}
      end

      -- go through bucket entries in order for an LSD radix sort
      for n=1,#bucket,1 do

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

         -- for string.sub, start at end of string (LSD sort) with -pass
         if key_length >= pass then
            pool = tonumber(string.sub(key, pass*-1, pass*-1))
         else
            pool = 0
         end

         -- add to appropriate queue, but no need to remove from bucket, reset it below
         table.insert(queue[pool + 1], key)
      end

      -- empty out the bucket and reset, use ipairs to call queues in order
      bucket={}
      for k,v in ipairs(queue) do
         for n=1,#v do
            table.insert(bucket, v[n])
         end            
      end
   end

   return bucket
end

这是一个测试运行:

> 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

答案 1 :(得分:0)

        pool = string.sub(key, 1,1) 

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