这是在Javascript中实现Counting Sort的好方法还是最好的方法? 找不到标准的JS Counting Sort示例。
function countingSort(arr){
var helper = []; // This helper will note how many times each number appeared in the arr
// Since JS arrary is an object and elements are not continuously stored, helper's Space Complexity minor that n
for(var i = 0; i<arr.length; i++){
if(!helper[arr[i]]){
helper[arr[i]] = 1;
}else{
helper[arr[i]] += 1;
}
}
var newArr = [];
for(i in helper){
while(helper[i]>0){
newArr.push(parseInt(i));
helper[i]--;
}
}
return newArr;
}
var arr = [5,4,3,2,1,0];
console.log(countingSort(arr)); // [0, 1, 2, 3, 4, 5]
答案 0 :(得分:1)
代码是正确的,有一些评论:
一般情况下,不建议在数组上使用for..in
,但除非你在Array原型上定义了可枚举的属性(无论如何这都是个坏主意),你对它的使用对我来说很好< / p>
您可以多次改进循环到push
相同值的部分。这可以通过将Array(helper[i]).fill(i)
连接到结果来“完成”。
您还可以使用reduce
使函数更多函数式编程样式。在极端情况下,它可能看起来像这样:
function countingSort(arr){
return arr.reduce( (acc, v) => (acc[v] = (acc[v] || 0) + 1, acc), [] )
.reduce( (acc, n, i) => acc.concat(Array(n).fill(i)), [] );
}
// Sample run:
var arr = [5,4,3,2,1,0];
console.log(countingSort(arr)); // [0, 1, 2, 3, 4, 5]
答案 1 :(得分:0)
计数排序将从初始化长度为k的辅助数组开始,该数组将保存每个数字的计数。每个索引的初始值为0。此后,您遍历输入数组,每次在数组中遇到该数字时,将每个值的“计数”增加1。现在,辅助数组保存每个元素在输入数组中的次数。最后一步是从最小值循环到最大值。在此循环中,您将循环遍历count数组中的每个对应值,然后将count大于0的元素按顺序添加到该数组中。您可以通过使用第二个增量变量来添加每个项目(例如,如果我们使用“ i”从最小值到最大值循环,那么我们将使用“ j”在数组中循环),然后增加第二个增量变量因此,将下一项放置在数组的下一个最高索引中,最后减少计数数组中当前项的值,以免添加太多该值的元素。
let countingSort = (arr, min, max) => {
let i = min,
j = 0,
len = arr.length,
count = [];
for (i; i <= max; i++) {
count[i] = 0;
}
for (i = 0; i < len; i++) {
count[arr[i]] += 1;
}
for (i = min; i <= max; i++) {
while (count[i] > 0) {
arr[j] = i;
j++;
count[i]--;
}
}
return arr;
};
答案 2 :(得分:0)
const countingSort = (arr, min, max) => {
let counters = [...Array(max+1)].map(e => 0);
let result = []
for(let i = min; i < max; i++){
counters[arr[i]] += 1
}
for(let j = min; j <= max; j++){
while( counters[j] > 0){
result.push(j)
counters[j]--
}
}
return result
}