'use strict';
/////////////////////////////////////////////////
// 桶排序
/////////////////////////////////////////////////
var _this = this
, L = require('linklist');//链表
/**
* 普通数组桶排序,同步
*
* @param arr Array 整数数组
* @param num 桶的个数
*
* @example:
* sort([1,4,1,5,3,2,3,3,2,5,2,8,9,2,1],5)
* sort([1,4,1,5,3,2,3,3,2,5,2,8,9,2,1],5,0,5)
*/
exports.sort = function (arr, count) {
if (arr.length == 0) return [];
count = count || (count > 1 ? count : 10);
// 判断最大值、最小值
var min = arr[0], max = arr[0];
for (var i = 1; i < arr.length; i++) {
min = min < arr[i] ? min : arr[i];
max = max > arr[i] ? max : arr[i];
}
var delta = (max - min + 1) / count;
// console.log(min+","+max+","+delta);
//初始化桶
var buckets = [];
//存储数据到桶
for (var i = 0; i < arr.length; i++) {
var idx = Math.floor((arr[i] - min) / delta); // 桶索引
if (buckets[idx]) {//非空桶
var bucket = buckets[idx];
var insert = false;//插入标石
L.reTraversal(bucket, function (item, done) {
if (arr[i] <= item.v) {//小于,左边插入
L.append(item, _val(arr[i]));
insert = true;
done();//退出遍历
}
});
if (!insert) { //大于,右边插入
L.append(bucket, _val(arr[i]));
}
} else {//空桶
var bucket = L.init();
L.append(bucket, _val(arr[i]));
buckets[idx] = bucket; //链表实现
}
}
var result = [];
for (var i = 0, j = 0; i < count; i++) {
L.reTraversal(buckets[i], function (item) {
// console.log(i+":"+item.v);
result[j++] = item.v;
});
}
return result;
}
//链表存储对象
function _val(v) {
return {v: v}
}
var algo = require('./index.js');
var data = [ 7, 36, 65, 56, 33, 60, 110, 42, 42, 94, 59, 22, 83, 84, 63, 77, 67,101 ];
console.log(data);
console.log(algo.bucketsort.sort(data,5));//5个桶
console.log(algo.bucketsort.sort(data,10));//10个桶
[ 7, 36, 65, 56, 33, 60, 110, 42, 42, 94, 59, 22, 83, 84, 63, 77, 67, 101 ] [ 7, 22, 33, 36, 42, 42, 56, 59, 60, 63, 65, 67, 77, 83, 84, 94, 101, 110 ] [ 7, 22, 33, 36, 42, 42, 56, 59, 60, 63, 65, 67, 77, 83, 84, 94, 101, 110 ]
//产生100W条,[200,900]闭区间的数据
var data = algo.data.randomData(1000*1000,200,900);
var s1 = new Date().getTime();
algo.quicksort.sort(data);//快速排序
var s2 = new Date().getTime();
algo.bucketsort.sort(data,700);//装到700个桶
var s3 = new Date().getTime();
console.log("quicksort time: %sms",s2-s1);
console.log("bucket time: %sms",s3-s2);
quicksort time: 14768ms bucket time: 1089ms
O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有