这篇文章主要介绍了javascript 数组的正态分布排序的问题的相关资料,需要的朋友可以参考下
题目:
有一个数组为:var arr = [1,2,1,3,3,2,4,6,3],通过处理将其变为正态分布的形式: [1,2,3,3,6,4,3,2,1]。
关于正态分布我就简单解释一下吧,其实看到处理后的数组大致也能明白,就是两头小,中间大,体现到坐标轴里的正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟型曲线。
如下代码:
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<l;i++){ if(i%2==0){ temp[i/2] = sortArr[i] // 下标为偶数的顺序放到前边 } else { temp[l-(i+1)/2] = sortArr[i] // 下标为奇数的从后往前放 } } console.log(temp) // [1, 2, 3, 3, 6, 4, 3, 2, 1] 看起来挺完美哈 })(arr)
还有这样的一种情况:
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<l;i++){ if(i%2==0){ temp[i/2] = sortArr[i] } else { temp[l-(i+1)/2] = sortArr[i] } } console.log(temp) //[1, 3, 5, 7, 9, 8, 6, 4, 2] 问题出现了。。 })(arr)
是的,这样一来这个数组的左右部分并不是对称的,以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<l;i++){ var eq = sortArr[i] i%2 == 0 ? temp_left.push(eq) : temp_right.unshift(eq) if(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的区别详细为你讲解
深入理解JavaScript中的块级作用域、私有变量与模块模式(图文教程)
以上是利用javascript实现数组的正态分布排序的问题(附有代码)的详细内容。更多信息请关注PHP中文网其他相关文章!