Home  >  Article  >  Web Front-end  >  The problem of using javascript to implement normal distribution sorting of arrays (code attached)

The problem of using javascript to implement normal distribution sorting of arrays (code attached)

亚连
亚连Original
2018-05-19 16:15:162089browse

This article mainly introduces relevant information on the normal distribution sorting of javascript arrays. Friends who need it can refer to the

topic:

There is an array: var arr = [1,2,1,3,3,2,4,6,3], which is transformed into a normal distribution form through processing: [1,2,3,3,6,4,3,2,1 ].

Let me briefly explain the normal distribution. In fact, you can roughly understand it when you see the processed array. It is small at the two ends and large in the middle. The normal curve reflected in the coordinate axis is bell-shaped, with the two ends It is low, high in the middle, and symmetrical. Because the curve is bell-shaped, people often call it a bell-shaped curve.

The following code:

 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)

There is another situation:

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)

Yes, in this way, the left and right parts of the array are not symmetrical, with 9 as the In the center, the left side is 1 3 5 7 = 16, and the right side is 2 4 6 8 = 20. It is obvious that the left side is lighter and the right side is heavier. It is not a uniform normal distribution. As the array increases, problems will arise. It will become more and more serious.

It seems that the previous code cannot be used, and we can only rethink the solution. In fact, the core of the problem is to ensure that the left and right sides of the array are equal or approximately equal, regardless of whether it is an odd-numbered array or an even-numbered array. number, the array can be divided into two parts (an odd number can also be regarded as an even array after discarding the maximum value. It does not matter even if there are multiple identical maximum values. Just sort it from small to large and remove the last one) , still follow the above method, put the subscript on the left when it is an even number, and put it on the right when it is an odd number. During the growth process of the arrays on the left and right sides, when the lengths of the arrays are equal, the sum of the arrays on the left and right sides is For comparison, because it is arranged from small to large, so under normal circumstances, the right side will be larger than the left side, and then the first one on the right side and the last one on the left side can be interchanged to achieve the purpose of balance. The code is as follows:

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]

In this way, the entire normal distribution will be much more uniform. Do a few more sets of tests to see the effect:

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]

The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.

Related articles:

The difference between getElementById().innerHTML and getElementById().value will be explained to you in detail

In-depth understanding of block-level scope, private variables and module mode in JavaScript (graphic tutorial)

Use js to implement event processing model

The above is the detailed content of The problem of using javascript to implement normal distribution sorting of arrays (code attached). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn