【发布时间】:2010-09-28 21:07:10
【问题描述】:
我想出了以下方法,但可以预见的是它不起作用。
var t = new Array(a.length);
var r = 4;
var b = 64;
var count = new Array(1<<r);
var pref = new Array(1<<r);
var groups = Math.ceil(b / r);
var mask = (1 << r) - 1;
var shift = 0;
for(var c = 0; c < groups; c++)
{
shift += r;
for(var j = 0; j < count.length; j++)
{
count[j] = 0;
}
for(var i = 0; i < a.length; i++)
{
count[ (a[i] >> shift) & mask ]++;
}
pref[0] = 0;
for(var i = 0; i < count.length; i++)
{
pref[i] = pref[i-1] + count[i-1];
}
for(var i = 0; i < a.length; i++)
{
t[ pref[ (a[i] >> shift) & mask ]++ ] = a[i];
}
for(var i = 0; i < a.length; i++)
{
a[i] = t[i];
}
// a is sorted?
}
【问题讨论】:
-
a保存输入的整数数组?为什么不将count、pref和groups归零? JS 中的数组,即使是通过new Array(length)创建的数组也以未定义的内容开头,而undefined + 0是NaN。 -
@Mike:首先,我什至不太确定这种 supposed 是如何工作的,因此我不确定出了什么问题。
count已清零,pref在使用前已初始化,groups不是数组。 -
基数排序通过查看排序键的片段进行排序,片段足够小,以至于片段的所有可能值都可以描述可管理数量的离散列表。想象一下对您的 CD 收藏进行分类:首先按艺术家姓名的第二个字母制作一堆,然后通过 A - Z 堆,并按第一个字母制作新的一堆。当您再次捡起 A - Z 堆并在架子上从左到右排列时,它们就被分类了!
-
能否提供样例输入输出?
-
一个问题是“b”似乎代表每个整数的位大小,这对于 Javascript 来说是错误的值。 Javascript 整数只有 32 位(或 31 位)。
标签: javascript sorting radix-sort