Heim  >  Artikel  >  Web-Frontend  >  Das Problem der Verwendung von Javascript zur Implementierung der Normalverteilungssortierung von Arrays (Code im Anhang)

Das Problem der Verwendung von Javascript zur Implementierung der Normalverteilungssortierung von Arrays (Code im Anhang)

亚连
亚连Original
2018-05-19 16:15:162093Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zum Problem der Normalverteilungssortierung von Javascript-Arrays vorgestellt. Freunde, die sie benötigen, können auf

Titel:

Es gibt ein Array: var arr = [. 1,2,1,3,3,2,4,6,3], die durch Verarbeitung in eine Normalverteilungsform umgewandelt wird: [1,2,3,3,6,4,3,2,1 ] .

Lassen Sie mich die Normalverteilung kurz erklären. Sie können sie grob verstehen, wenn Sie das verarbeitete Array sehen. Es ist an den beiden Enden klein und in der Mitte groß ist glockenförmig, die beiden Enden sind niedrig, in der Mitte hoch und symmetrisch. Da die Kurve glockenförmig ist, wird sie oft als glockenförmige Kurve bezeichnet.

Der folgende 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)

Es gibt auch eine solche 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)

Ja, auf diese Weise sind der linke und rechte Teil des Arrays nicht symmetrisch, mit 9 als In der Mitte ist die linke Seite 1+3+5+7=16 und die rechte Seite ist 2+4+6+8=20. Es ist offensichtlich, dass die linke Seite heller ist und die rechte Seite schwerer. Es handelt sich nicht um eine gleichmäßige Normalverteilung. Wenn das Problem groß ist, werden die Probleme immer schwerwiegender.

Es scheint, dass der vorherige Code nicht verwendet werden kann, und wir können die Lösung nur überdenken. Tatsächlich besteht der Kern des Problems darin, sicherzustellen, dass die linke und rechte Seite des Arrays gleich oder ungefähr gleich sind. Unabhängig davon, ob es sich um ein Array mit ungerader oder gerader Nummer handelt, kann das Array in zwei Teile geteilt werden (eine ungerade Zahl kann nach Verwerfen des Maximalwerts auch als gerades Array betrachtet werden. Gerade spielt es keine Rolle Wenn es mehrere identische Maximalwerte gibt, sortieren Sie sie einfach von klein nach groß und entfernen Sie den letzten. Befolgen Sie weiterhin die obige Methode, setzen Sie den Index links, wenn es sich um eine gerade Zahl handelt, und setzen Sie ihn rechts, wenn er eine gerade Zahl ist eine ungerade Zahl. Wenn die Längen der Arrays auf der linken und rechten Seite gleich sind, ist die Summe der Arrays auf der linken und rechten Seite zum Vergleich, da sie von klein nach groß angeordnet ist Unter normalen Umständen ist die rechte Seite also größer als die linke. Tauschen Sie dann die erste rechts mit der letzten links aus, um ein Gleichgewicht zu erreichen. Der Code lautet wie folgt:

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]

Auf diese Weise wird die gesamte Normalverteilung gleichmäßiger sein die Zukunft.

Verwandte Artikel:

Der Unterschied zwischen getElementById().innerHTML und getElementById().value wird Ihnen ausführlich erklärt


Umfassendes Verständnis des Bereichs auf Blockebene, privater Variablen und des Modulmodus in JavaScript (grafisches Tutorial)


Verwendung von js zur Implementierung des Ereignisverarbeitungsmodells

Das obige ist der detaillierte Inhalt vonDas Problem der Verwendung von Javascript zur Implementierung der Normalverteilungssortierung von Arrays (Code im Anhang). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn