Javascript计数排序实现
这是在Javascript中实现计数排序的好方法还是最好的方法? 找不到标准JS计数排序示例Javascript计数排序实现,javascript,algorithm,counting-sort,Javascript,Algorithm,Counting Sort,这是在Javascript中实现计数排序的好方法还是最好的方法? 找不到标准JS计数排序示例 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
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]
函数计数排序(arr){
var helper=[];//此helper将记录每个数字在arr中出现的次数
//由于JS arrary是一个对象,并且元素不是连续存储的,所以helper的空间复杂度小于n
对于(var i=0;i0){
newArr.push(parseInt(i));
助手[i]-;
}
}
返回newArr;
}
var-arr=[5,4,3,2,1,0];
console.log(countingSort(arr));//[0, 1, 2, 3, 4, 5]
代码是正确的,并附有一些注释:
- 一般来说,不鼓励在数组上使用
,但除非您在数组原型上定义可枚举属性(这是一个坏主意),否则您可以使用它for..In
- 您可以改进循环多次推送相同值的部分。这可以通过连接
填充到结果中数组(helper[i])以“一次”的方式完成。将(i)
reduce
使函数更具有功能性编程风格。在极端情况下,它可能是这样的:
函数计数排序(arr){
返回arr.reduce((acc,v)=>(acc[v]=(acc[v]|0)+1,acc),[])
.reduce((acc,n,i)=>acc.concat(数组(n).fill(i)),[]);
}
//样本运行:
var-arr=[5,4,3,2,1,0];
console.log(countingSort(arr));//[0,1,2,3,4,5]
计数排序是通过初始化长度为k的辅助数组开始的,该数组将保存每个数字的计数。每个索引的初始值为0。之后,循环输入数组,每次遇到数组中的数字时,将每个值的“计数”增加1。现在,辅助数组保存每个元素在输入数组中的次数。最后一步是从最小值循环到最大值。在这个循环中,您将循环计数数组中的每个对应值,并按顺序将计数大于0的元素添加到数组中。通过使用第二个递增变量添加每个项(例如,如果我们使用“i”从最小值循环到最大值,那么我们将使用“j”在数组中循环),然后增加第二个递增变量,以便将下一个项放在下一个最高的数组索引中,最后,减少count数组中当前项的值,这样就不会添加太多的元素
const countingSort=(arr、min、max)=>{
常量计数={};
//首先填充count对象
对于(设i=min;iconst countingSort=(arr,min,max)=>{
让计数器=[…数组(max+1)].map(e=>0);
让结果=[]
for(设i=min;i
,并链接到至少一个JS实现。在结果的第一个链接中为我提供了一个JS实现。很酷,这也是这里唯一一个不依赖Javascript对象中的数字键在迭代时排序的实现。(虽然人们通常可以在较新的环境中依赖这种怪癖,但在这样的算法中使用它对我来说有点像作弊,因为算法最重要的部分,即密钥排序,是由解释器在幕后完成的,而不是由代码编写者的编程实现完成的。)此算法输出错误。需要先准备直方图,请参阅
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
}