>웹 프론트엔드 >JS 튜토리얼 >배열의 정규분포 정렬을 구현하기 위해 자바스크립트를 사용할 때 발생하는 문제(코드 첨부)

배열의 정규분포 정렬을 구현하기 위해 자바스크립트를 사용할 때 발생하는 문제(코드 첨부)

亚连
亚连원래의
2018-05-19 16:15:162142검색

이 글은 주로 자바스크립트 배열의 정규분포 정렬 문제에 대한 관련 정보를 소개하고 있습니다. 필요하신 분들은 참고하시면 됩니다.

제목:

배열이 있습니다: 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를 사용하여 이벤트 처리 모델 구현

위 내용은 배열의 정규분포 정렬을 구현하기 위해 자바스크립트를 사용할 때 발생하는 문제(코드 첨부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.