这篇文章主要介绍了javascript 数组的正态分布排序的问题的相关资料,需要的朋友可以参考下
题目:
有一个数组为:var arr = [1,2,1,3,3,2,4,6,3],通过处理将其变为正态分布的形式: [1,2,3,3,6,4,3,2,1]。
关于正态分布我就简单解释一下吧,其实看到处理后的数组大致也能明白,就是两头小,中间大,体现到坐标轴里的正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟型曲线。
如下代码:
立即学习“Java免费学习笔记(深入)”;
var arr = [1,2,1,3,3,2,4,6,3]
~(function(arr) {
var temp = [], i = 0, l = arr.length,
sortArr = arr.sort(function(a,b){return a-b}) //先将数组从小到大排列得到 [1, 1, 2, 2, 3, 3, 3, 4, 6]
for (;i 还有这样的一种情况:
var arr = [1,2,3,4,5,6,7,8,9] // 一个规则递增的数组
~(function(arr) {
var temp = [], i = 0, l = arr.length,
sortArr = arr.sort(function(a,b){return a-b})
for (;i 是的,这样一来这个数组的左右部分并不是对称的,以9为中心,左侧为1+3+5+7=16,右侧为2+4+6+8=20,明显的是左轻右重,不是一个均匀的正态分布了,随着数组的增大,带来的问题会越来越严重。
看来前边的代码是不能用的,只能重新思考解决方法,其实问题的核心在于保证数组的左右两侧是相等或者大致相等的,不管是奇数个数的数组还是偶数个数的,数组可以分为两部分(奇数个数的抛去最大值后也可以看做是一个偶数数组,即便有多个相同最大值也无所谓,从小到大排序后去除最后一个即可),还是按照上边的方法,下标为偶数的时候放到左侧,为奇数的时候放到右侧,在左右两边的数组增长过程中,当数组长度相等的时候,对左右两侧数组之和进行比较,因为是按照从小到大排列的,所以正常情况下,右侧会大于左侧,然后将右侧第一个跟左侧最后一个互换一下即可达到平衡的目的,代码如下:
var arr = [1,2,3,4,5,6,7,8,9],
sortArr = arr.sort(function(a,b){return a-b}),
l = arr.length,
temp_left = [], temp_right = []
function sort(arr){
var i = 0
for(;i 1){
if( temp_left.length == temp_right.length && !compare(temp_left, temp_right)){
wrap(temp_left,temp_right) //数组相等并且右侧和大于左侧的时候进行交换
}
}
}
return temp_left.concat(temp_right)
}
// 数组求和
function sum(arr) {
return eval(arr.join("+"));
}
// 数组比较大小
function compare(arr1,arr2) {
return sum(arr1) >= sum(arr2)
}
// 左边最后一个跟右边第一个交换
function wrap(l,r){
var m = r.shift()
r.unshift(l.pop())
l.push(m)
}
console.log(sort(arr)) // 得到 [1, 4, 6, 7, 9, 8, 5, 3, 2] 这样一来整个正态分布就均匀多了,多做几组测试看看效果:
arr = [1,333,444,555,66,7788,909]
console.log(sort(arr)) /[1, 444, 909, 7788, 555, 333, 66]
arr = [168.6,177.5,174.2,189.3,167.2,177.6,167.8,175.5]
console.log(sort(arr)) //[167.2, 174.2, 175.5, 189.3, 177.6, 177.5, 168.6, 167.8]
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
getElementById().innerHTML与getElementById().value的区别详细为你讲解











