首頁 >web前端 >js教程 >利用javascript實現數組的常態分佈排序的問題(附有程式碼)

利用javascript實現數組的常態分佈排序的問題(附有程式碼)

亚连
亚连原創
2018-05-19 16:15:162118瀏覽

這篇文章主要介紹了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中的區塊級作用域、私人變數與模組模式(圖文教學)

#利用js實作事件處理模型

以上是利用javascript實現數組的常態分佈排序的問題(附有程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn