Maison  >  Article  >  interface Web  >  Le problème de l'utilisation de javascript pour implémenter le tri de distribution normal des tableaux (code ci-joint)

Le problème de l'utilisation de javascript pour implémenter le tri de distribution normal des tableaux (code ci-joint)

亚连
亚连original
2018-05-19 16:15:161991parcourir

Cet article présente principalement des informations pertinentes sur la question du tri de distribution normal des tableaux javascript. Les amis qui en ont besoin peuvent se référer à

Titre :

Il existe un tableau : var arr = [. 1,2,1,3,3,2,4,6,3], qui sera transformé en une forme de distribution normale grâce au traitement : [1,2,3,3,6,4,3,2,1 ] .

Laissez-moi vous expliquer brièvement la distribution normale. En fait, vous pouvez la comprendre à peu près lorsque vous voyez le tableau traité. Il est petit aux deux extrémités et grand au milieu. La courbe normale se reflète dans l'axe des coordonnées. est en forme de cloche, avec les deux extrémités. Elle est basse, haute au milieu et symétrique. Parce que la courbe est en forme de cloche, les gens l'appellent souvent une courbe en forme de cloche.

Le code suivant :

 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)

Il existe également une telle 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)

Oui, de cette façon, les parties gauche et droite du tableau ne sont pas symétrique, avec 9 comme centre, le côté gauche est 1+3+5+7=16 et le côté droit est 2+4+6+8=20. Il est évident que le côté gauche est plus clair et le côté droit. est plus lourd. Ce n'est pas une distribution normale uniforme. À mesure que le réseau grandit, les problèmes deviendront de plus en plus graves.

Il semble que le code précédent ne puisse pas être utilisé, et nous ne pouvons que repenser la solution. En fait, le cœur du problème est de s'assurer que les côtés gauche et droit du tableau sont égaux ou approximativement égaux, qu'il s'agisse d'un tableau impair ou d'un tableau pair, le tableau peut être divisé en deux parties (un nombre impair peut également être considéré comme un tableau pair après avoir ignoré la valeur maximale. Cela n'a pas d'importance, même. s'il y a plusieurs valeurs maximales identiques. Triez-les simplement de petit à grand et supprimez la dernière), suivez toujours la méthode ci-dessus, placez l'indice à gauche lorsqu'il s'agit d'un nombre pair et placez-le à droite lorsqu'il l'est. un nombre impair. Pendant le processus de croissance des tableaux sur les côtés gauche et droit, lorsque les longueurs des tableaux sont égales, la somme des tableaux sur les côtés gauche et droit est à titre de comparaison, car elle est disposée du petit au grand. , donc dans des circonstances normales, le côté droit sera plus grand que le côté gauche, puis échangez le premier à droite avec le dernier à gauche pour obtenir l'équilibre. Le code est le suivant :

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]

De cette façon, l'ensemble de la distribution normale sera plus uniforme. Faites quelques séries de tests supplémentaires pour voir l'effet :

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]

Ce qui précède est ce que j'ai compilé pour tout le monde, j'espère que ce sera le cas. utile pour vous à l’avenir. Tout le monde est utile.

Articles associés :

La différence entre getElementById().innerHTML et getElementById().value vous sera expliquée en détail

Compréhension approfondie de la portée au niveau du bloc, des variables privées et du mode module en JavaScript (tutoriel graphique)

Utilisation de js pour implémenter un modèle de traitement d'événements

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn