算法详解:
桶排序或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
算法描述:
桶排序利用函数的映射关系,减少了几乎所有的比较工作。实际上,桶排序的f(k)值的计算,其作用就相当于快排中划分,已经把大量数据分割成了基本有序的数据块(桶)。然后只需要对桶中的少量数据做先进的比较排序即可。
代码:
- 根据数组中数字的最大值 建立对应数量的桶(遍历时js会自己创建对应数量);
- 再根据数组中的每一项数字,把这些数字当做桶的对应索引,给这些索引的桶加水;
- 遍历一遍所有的桶,从左到右检索把有水的桶的下标列出来即可
<script type="text/javascript">
var arr = [3,2,5,10,7];
// bocket 承载下标的容器(桶)
var bocket = [];
for(var i = 0; i < arr.length ; i++){
// arr[i]是需要排列的数字
// console.log(arr[i]);
// 让arr中的每一个值arr[i],当做桶里的索引,这些下标是需要加水的
// 赋值为1的意思是加水:需要随意填一个数据,这个数据是什么不重要
bocket[arr[i]] = 1;
}
console.log(bocket);
// 取出索引 先清空原数组,再将排好序的元素push进去
arr.length = 0;
// 去遍历这个桶,列出加水的
for(var attr in bocket){
// for in之中的取出的attr是字符串,所以要转换
arr.push(Number(attr));
}
console.log(arr);
</script>
这是我所学到的,所以我要分享给你们,希望可以帮助到你们。
以上就是我的分享,新手上道,请多多指教(大神勿喷)。