2017-04-03 2 views
0

이것은 좋은 방법입니까, 아니면 자바 스크립트에서 계산 방식을 구현하는 가장 좋은 방법입니까? 표준 JS 카운팅 정렬 예제를 찾을 수 없습니다.자바 스크립트 계산 정렬 구현

function countingSort(arr){ 
    var helper = []; // This helper will note how many times each number appeared in the arr 
        // Since JS arrary is an object and elements are not continuously stored, helper's Space Complexity minor that n 
    for(var i = 0; i<arr.length; i++){ 
    if(!helper[arr[i]]){ 
     helper[arr[i]] = 1; 
    }else{ 
     helper[arr[i]] += 1; 
    } 
    } 

    var newArr = []; 
    for(i in helper){ 
    while(helper[i]>0){ 
     newArr.push(parseInt(i)); 
     helper[i]--; 
    } 
    } 
    return newArr; 
} 

var arr = [5,4,3,2,1,0]; 
console.log(countingSort(arr)); // [0, 1, 2, 3, 4, 5] 
+1

는 [정렬 카운트하는 위키 항목 알고리즘을 나타낸다 (https://en.wikipedia.org/wiki/Counting_sort) 및 적어도 하나의 JS 구현에 대한 링크. –

+1

[Google은 '자바 스크립트 계산 방식]에 대한 Google 검색 (https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=javascript+counting+sort&*)을 제공했습니다. 결과의 첫 번째 링크에서 js의 구현입니다. – csmckelvey

답변

0

코드는 일부 의견에, 올바른 :

일반적으로
  • 는, 배열에 for..in의 사용은 권장하지 않습니다,하지만 당신은 (배열 프로토 타입에 열거 속성을 정의하지 않는 한 나쁜이다 아이디어 어쨌든), 당신의 사용은 내게 괜찮습니다

  • push 동일한 값을 여러 번 반복 부분을 향상시킬 수 있습니다. 결과에 Array(helper[i]).fill(i)을 연결하여 'one'로 수행 할 수 있습니다.

또한 기능을 더 함수형 프로그래밍 스타일을 만들기 위해 reduce를 사용할 수 있습니다. 극단적으로, 이는 다음과 같을 수있다 :

function countingSort(arr){ 
 
    return arr.reduce((acc, v) => (acc[v] = (acc[v] || 0) + 1, acc), []) 
 
      .reduce((acc, n, i) => acc.concat(Array(n).fill(i)), []); 
 
} 
 

 
// Sample run: 
 
var arr = [5,4,3,2,1,0]; 
 
console.log(countingSort(arr)); // [0, 1, 2, 3, 4, 5]