构造辅助阵列,这将沿着包含值,其原有的指数 - O(n)
。
[[0, 'abb'], [1, 'ada'], [2, 'bba'], [3, 'bba'], [4, 'dab'], [5, 'bad']] // Stored as 'foo' in the following examples
排序使用comparator function新创建的数组 - 根据你的假设O(n)
(但我怀疑)。
foo.sort(function (a, b) { return a[1].localeCompare(b[1]); });
遍历已排序的数组并在路上创建排序数组 - O(n)
。
var last = null, rank = 0, result = [], i;
for (i = 0; i < foo.length; i++) {
result[foo[i][0]] = (last === null || last.localeCompare(foo[i][1]) != 0) ? ++rank : rank;
last = foo[i][1];
}
请享受您的result
。
更新另一种方式如何做到这一点是通过关联数组的索引:
{ 'abb': [0], 'ada': [1], 'bba': [2, 3], 'dab': [4], 'bad': [5] }
然后您可以创建密钥(因此唯一值)的阵列,排序,并构建一个基于你的排名在那。
'sort'是用JavaScript中的基数排序实现的吗?如果这很有趣,你有一些参考? –
'A'可以重复吗?如果是这样,会发生什么? –
请注意,您不能保证在JS中使用'Array#sort()'的'O(n)'。我们无法控制特定env使用的排序算法。 – James