2011-02-13 3 views
0

간단한 비교 함수를 전달할 때 Array.sort() 호출에서 무슨 일이 일어나고 있는지 "보기"어렵습니다. 지금까지 해왔지만 숫자가 합쳐지지 않는 것 같아서 JavaScript가 어떻게 결론에 도달했는지 알고 싶습니다. 어쩌면 나는 그것의 근본적인 점을 놓치고있다.JavaScript의 내부 동작 Array.sort ([compareFunc]);

var nums = new Array(40,20,230,65); 

var b = a.sort(function(a,b){ 

return a-b; 

}); 

그래서, 이런 식으로 운동 :

  1. = 40-20 = 20 (> 0), B 또는 그래서 20,40

  2. 230-65 = (165) (> 0) A, B 또는 매우 230,65

  3. 40-65 = -25 (< 0)이므로, B 또는 40,65

나는 그 숫자를 가지고 그것을 실행했고, 3 가지 계산을하고 20,40,65,230에 올랐지 만, "어떻게"를 모른다 ... 어떤 식으로 그것을 넣을 숫자를 선택 했는가? 생성 된 정렬 배열에 추가합니다. 제 말은 대답에서 여섯 개의 숫자를 얻었습니다. (세 가지 계산 결과) 어떻게 그 6 개를 필요한 네 개로 만들 수 있습니까?

도움이됩니다. 나는이 사실을 이해하고 정말로 싶습니다. :)

편집 : 좋아, 내가 어떻게 작동하는지, 원래 배열에 대한 mucks 정렬 함수에서 반환 된 값 당 숫자를 re-ordering. 그러나 4 개의 숫자 배열을 사용할 때 두 번의 "이동"으로 처리 할 수 ​​있지만 JavaScript는 3 개이며 마지막 하나는 다소 관계없는 것 같습니다. 그것을 시도하고 볼 수 있습니다. :)


마지막으로 가장 좋은 업데이트!

이 질문을하는 동안 저는 종이와 자바 스크립트에 대해 배웠고 빠른 분류가 어떻게 작동하는지 발견했습니다. 나는 로그에 큰 아니지만,이게 내가 수학에서 더 많은 관심을 기울일 수 있도록 가르쳐 줄 것 같아.

공간을 절약하기 위해 마지막 예를 사용 했으므로 여기에 내가 수행 한 정렬의 또 다른 예가 있습니다. 그것은 JS에서 배열에서 선택하는 숫자 쌍의 순서가 다소 예측할 수 없다는 점을 제외하고는 종이에서했던 것과 정확히 일치합니다. 그래서 실제로 할 수있는 비교가 더 많습니다. 시간에 대한 결과를 미리 생각하고 원하는대로 숫자 쌍을 선택하십시오 (매우 컴퓨터가 아닌 것처럼).

이 테스트에서는 6 회의 계산에서 JS가 그것을 10 번 수행했는데, 공정성이 더 철저합니다.

배열 == 2,16,7,3,10

2-16 == -14 (< 0) | 2,16,7,3,10

16-7 == 9 (> 0) | 2,7,16,3,10

16-3 == 13 (> 0) | 2,7,3,16,10

16-10 == 6 (> 0) | 2,7,3,10,16

2 - 7 == -5 (< 0) | 2,7,3,10,16

7-3 == 4 (> 0) | 2,3,7,10,16

배열 == 2,3,7,10,16

이 빠른 종류의 피벗 번호를 사용하기 때문에 엄격하게, 빠른 종류의 말하기, 경우 확실하지 않음 정렬에서 배열을 나눌 중심 지점으로 사용합니다. 그러나 이것이 JS가 어떻게하고 있는지에 대한 나의 이해입니다. 틀 렸으면 고쳐줘. :)

+0

두 개의 비교만으로는 정렬 할 수 없으며'[4,2,1,3]'은 최상의 경우에'[2,4,1,3]'이 될 수 있습니다. – Dykam

+0

Array.sort()를 비교 함수없이 사용하면 사전 식으로 사전 식으로 정렬됩니다. 그러나 "a-b"와 같은 정렬 기준을 통과하면 정렬을 제어합니다. 따라서 [4,2,1,3]은 [1,2,3,4]이 될 것입니다 ... 그건 내 이해입니다. :) – Tom

답변

1

구현은 빠른 정렬 알고리즘을 사용합니다. 그것에 대해 읽으십시오 here.

+0

Gor ... 나는 당신을 사랑한다 !! 감사! 그걸 파헤쳐 버릴거야. JavaScript가 어떻게 그 번호를 선택했는지 이해하지 못했습니다. 3 숫자 배열을 사용하여이 작업을 수행하면 2 가지 계산으로 답을 얻을 수 있지만 JavaScript는 3을 수행합니다 ...? – Tom

0

N 개 요소의 배열이 주어지면 N 개의 팩토리 순열이 있으며 그 중 하나만 정렬됩니다. 각 비교는 순열을 두 세트로 나눕니다. 따라서 알고리즘 및 원래 순열에 의존하지만 요소가 순열되어 있는지 확인하기 위해 O (log (N!)) 비교가 필요합니다.

원본 4 요소 배열의 경우 원래 배열에 대한 가정을하지 않고 5 번의 비교로 배열을 정렬 할 수있는 사용자 지정 정렬 루틴을 작성할 수 있지만 3 분의 1의 경우에만 운이 좋습니다 4 비교를 사용하십시오. 다른 한편으로 버블 정렬은 배열이 이미 정렬 된 것으로 판명 난 경우에는 3 번의 비교 만 필요하지만 6 번의 비교가 필요할 수 있습니다. 대부분의 브라우저는 잘 알려진 성능 특성을 가진 표준 제네릭 정렬 알고리즘 중 하나를 사용합니다.

+0

원래 종이와 자바 스크립트에서 몇 가지 작업을 해본 결과 질문을 던지기 시작한 이래로 나는 그것을 이해하는 것처럼 느낀다. 나는 버블 정렬 (삽입 등)이 빠른 정렬보다 머리를 감싸기가 더 어려운 알고리즘이라고 생각한다. 빠른 정렬은 더 직선적 인 것처럼 보일뿐 아니라 Gor가 올바른 경우 JavaScript가 빠른 정렬을 사용하고 JavaScript (C++이 아닌)의 컨텍스트에서 사용된다.) 그 다음 나는 quicksort를 완전하게 이해할 필요가 있었다 (원했다). 그래도 대답 해 줘서 고마워. 나는 그것을 좋아한다. :디 – Tom