给定数组arr[n],其中n=10000,0<arr[i]<9999,-1<i<10000.
已知数组中的值时乱序的,且其值均匀分布在0-9999 区间,只有少量数值重复
请用js代码写一个函数,以最快的方式完成对该数组的升序排序,要求算法时间复杂度必须小于O(NLOG2N).
给定数组arr[n],其中n=10000,0<arr[i]<9999,-1<i<10000.
已知数组中的值时乱序的,且其值均匀分布在0-9999 区间,只有少量数值重复
请用js代码写一个函数,以最快的方式完成对该数组的升序排序,要求算法时间复杂度必须小于O(NLOG2N).
采用一个类似于位图的结构来解决这个问题。首先,你的数据量不大,而且像你说的重复数目也不多,这里看作常数。可以声明一个10000字节大小的数组count[10000],初始化为全0。扫描一遍你的待排序的数据,针对每一个值i,递增其对应的位置的数组值count[i]。扫描完毕后,再从头扫描一遍a[10000],对于i,输出a[i]次即可。这样时间复杂度为O(n),
我js不怎么懂。勉强给你写个函数
function mySort(arr, length) {
var count = new Array(length);
for (var i = 0; i != length; i++) {
count[i] = 0;
}
for (var i = 0; i != length; i++) {
count[arr[i]]++;
}
var index = 0;
for (var i = 0; i != length; i++) {
for (var j = 0; j < count[i]; j++) {
arr[index ++] = i;
}
}
//alert(count);
}
// An example
var arr = new Array(10);
arr[0] = 1;
arr[1] = 2;
arr[2] = 1;
arr[3] = 0;
arr[4] = 9;
arr[5] = 8;
arr[6] = 6;
arr[7] = 2;
arr[8] = 3;
arr[9] = 6;
mySort(arr, 10);
alert(arr);
数据很小,不要求空间复杂度的话直接桶排。
var a = new Array;
for(var i=1;i<=10000;i++){
a[arr[i]]++;
}
//排序完成,可以输出了
for(var i=1;i<=10000;i++){
for(var j=1;j<=a[i];j++){
alert(i);
}
}
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
1 回答3.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
数据是均匀分布的,用桶排序挺合适,时间复杂度也必定小于NlogN。
对于N个待排数据,M个桶,桶排序平均时间复杂度为:O(N+N(logN/M)).
桶数越多,速度越快,但空间代价也越大。
具体算法就不写了。
//=======补充代码======
在firefox中测试,10000条数据,桶排序快一倍以上。