ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript を使用して配列の正規分布ソートを実装する際の問題 (コードは添付されています)

JavaScript を使用して配列の正規分布ソートを実装する際の問題 (コードは添付されています)

亚连
亚连オリジナル
2018-05-19 16:15:162074ブラウズ

この記事は主に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となるので、配列としては左側が軽く、右側が重いことがわかります。増加すると、問題はますます深刻になります。

以前のコードは使用できないようで、解決策を再考するしかありません。実際、問題の核心は、配列の左辺と右辺が等しいかほぼ等しいことを確認することです。配列は奇数配列でも偶数配列でも2つに分割できます(奇数でも最大値を捨てて偶数配列とみなすことができます。同じ最大値が複数あっても問題ありません)。小さいものから大きいものへ並べ替えて、最後のものを削除するだけです) または、上記の方法に従い、添え字が偶数の場合は左側に配置され、奇数の場合は右側に配置されます。左側と右側の配列が成長する過程で、配列の長さが等しい場合、左側と右側の配列の合計が比較されます。これは、左側と右側の配列が小さいものから大きいものへと配置されているためです。通常の状況では、右側が左側よりも大きくなります。次に、右側の最初のものと左側の最後のものを交換して、バランスをとります。 コードは次のとおりです。

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 (画像とテキストのチュートリアル)

js を使用してイベント処理モデルを実装する

以上がJavaScript を使用して配列の正規分布ソートを実装する際の問題 (コードは添付されています)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。