이 글은 주로 자바스크립트 배열의 정규분포 정렬 문제에 대한 관련 정보를 소개하고 있습니다. 필요하신 분들은 참고하시면 됩니다.
제목:
배열이 있습니다: 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(그림 및 텍스트 자습서)
위 내용은 배열의 정규분포 정렬을 구현하기 위해 자바스크립트를 사용할 때 발생하는 문제(코드 첨부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!