参考http://www.cnblogs.com/hapjin/p/5534262.html
桶排序感觉很好理解,也不精深,但是很清奇,简直是各种排序算法里的一股清流,我觉得这种奇特的排序方式也可以提醒自己解决问题的办法有时候就是那么简单直接,不要弯弯绕
排序原理,比方说有个数组[5,8,3,8],要给他们排序,那么就定一个0~9的数组(长度是10,不是4),然后从0到9循环,如果序号和数组里的数相等,就把这个序号对应的值+1;然后再循环一遍0-9,输出每个序号,序号里的值是多少就输出几次。
直接看代码
bucketsSort([5,8,3,8]);
function bucketsSort(arr){
var sortArr = [];
for(var j = 0; j < 10; j++){
sortArr.push(0);//填充10个0
}
for(var i = 0; i < arr.length; i++){
sortArr[arr[i]]++;
}
printout(sortArr);
}
function printout(sortArr){
for(var k = 0; k < sortArr.length; k++){
for(var m = 0; m < sortArr[k]; m++){
console.log(k);
}
}
}
代码写的不好看,冗余比较多,就看个思路
如果是要根据对象里的某个属性进行,就相对麻烦些
var obj1={age:5,name:'a'},
obj2={age:8,name:'b'},
obj3={age:3,name:'c'},
obj4={age:8,name:'d'};
bucketsSort([obj1,obj2,obj3,obj4]);
function bucketsSort(arr){
var sortArr = [];
for(var j = 0; j < 10; j++){
sortArr.push([]);
}
for(var i = 0; i < arr.length; i++){
sortArr[arr[i].age].push(arr[i]);//直接把obj放到桶里
}
printout(sortArr);
}
function printout(sortArr){
for(var k = 0; k < sortArr.length; k++){
for(var m = 0; m < sortArr[k].length; m++){
console.log(sortArr[k][m]);
}
}
}
上面的代码是我自己写的,应该有更好的办法
感觉上由于桶排序的特性,只有对可以转化成数字的属性才能排序,可能我思路不开阔
记录一个参考文章里的开阔思路的方式,排序字符串(其实和排序位数多的数字是一样的思路),先排低位(先排高位应该也一样),低位有序以后,再排次低位,一路排到最高位。
比如[83,115,159,115],如果按最直接不拐弯的思路那就要1000个桶了,那就拐个弯,先排个位,排完是[83,115,115,159],再排十位,排完是[115,115,159,83],再排百位,排完是[83,115,115,159],不过我估计这代码写起来(尤其是对象属性的那种)可读性不咋地,权当一种思路