我认为这是重复的,但我找不到。
假设我们有一个数组,其中我们知道每个值都是唯一的,并且每个值都在一个范围之间。例如,假设我们知道数组由 0 到 100 之间的唯一值组成。示例:
[ 5, 46, 15, 83, 55, 28 ]
然后我想将此数组排序为以下内容:
[ 5, 15, 28, 46, 55, 83 ]
显然我可以只使用快速排序或任何其他比较排序,但那将是 O(n log n)
。也存在非比较排序,例如基数排序、桶排序、计数排序等。但据我所知,这些都没有保持值必须唯一的约束。
通常情况下,您允许的约束越多,算法的效率就越高。是否有任何算法对唯一的有界数组更有效?如果不是,对于此类数据集,哪种非比较排序算法最有效?
答案 0 :(得分:2)
给定唯一值的约束和限制范围,您可以声明一个数组,其长度足以容纳给定范围内的每个唯一整数,然后您可以执行特殊情况的桶排序,其中每个桶总是能够包含一个唯一值,最后过滤数组以删除剩余的空槽。与其他非比较排序算法一样,这种方法的渐近时间复杂度为 O(n)。
const input = [5, 46, 15, 83, 55, 28];
function sort(unsorted, lower, upper) {
const sorted = Array(upper - lower);
for (let i = 0; i < unsorted.length; ++i) {
sorted[unsorted[i] - lower] = unsorted[i];
}
return sorted.filter(() => true);
}
const output = sort(input, 0, 100);
console.log(output);
答案 1 :(得分:1)
类似的东西?
const arr1 = [ 5, 46, 15, 83, 55, 28 ]
const min = Math.min( ...arr1)
const res = []
for(let v of arr1) res[v-min] = v
for(let i=res.length;i--;) if (res[i]===undefined) res.splice(i, 1)
console.log( res )
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
我建议使用计数排序,但使用字节数组来表示通常的计数,因为要排序的数组具有唯一值,因此计数值只会是 0 或 1。这也适用于没有值出现超过 255 次的数组(这样每个计数仍然适合一个无符号字节)。