Javascript의 sort ()는 어떻게 작동합니까?
다음 코드는이 배열을 숫자 순서로 어떻게 정렬합니까?
var array=[25, 8, 7, 41]
array.sort(function(a,b){
return a - b
})
계산 결과가 ...
Less than 0 : "a"가 "b"보다 낮은 인덱스로 정렬됩니다.
0 : "a"와 "b"는 동일한 것으로 간주되며 정렬이 수행되지 않습니다.
0보다 큼 : "b"가 "a"보다 낮은 인덱스로 정렬됩니다.
정렬 과정에서 배열 정렬 콜백 함수가 여러 번 호출됩니까?
그렇다면 매번 함수에 어떤 두 숫자가 전달되는지 알고 싶습니다. 처음에는 "25"(a)와 "8"(b), "7"(a) 및 "41"(b)를 사용한다고 가정했습니다.
25 (a)-8 (b) = 17 (0보다 크므로 "b"를 "a"보다 낮은 인덱스로 정렬) : 8, 25
7 (a)-41 (b) = -34 (0보다 작으므로 "a"를 "b"보다 낮은 인덱스로 정렬 : 7, 41
두 세트의 숫자는 서로를 기준으로 어떻게 정렬됩니까?
고군분투하는 초보자를 도와주세요!
정렬 과정에서 배열 정렬 콜백 함수가 여러 번 호출됩니까?
예
그렇다면 매번 함수에 어떤 두 숫자가 전달되는지 알고 싶습니다.
다음을 통해 자신을 찾을 수 있습니다.
array.sort((a,b) => {
console.log(`comparing ${a},${b}`);
return a > b ? 1
: a === b ? 0
: -1;
});
편집하다
이것은 내가 얻은 출력입니다.
25,8
25,7
8,7
25,41
JavaScript 인터프리터에는 일종의 정렬 알고리즘 구현이 내장되어 있습니다. 정렬 작업 중에 몇 번 비교 함수를 호출합니다. 비교 함수가 호출되는 횟수는 특정 알고리즘, 정렬 할 데이터 및 정렬 전 순서에 따라 다릅니다.
일부 정렬 알고리즘은 일반적인 경우보다 훨씬 더 많은 비교를 수행하기 때문에 이미 정렬 된 목록에서 제대로 수행되지 않습니다. 다른 사람들은 미리 정렬 된 목록에 잘 대처하지만 실적이 저조하도록 "속일 수있는"다른 경우가 있습니다.
단일 알고리즘이 모든 목적에 완벽하지 않기 때문에 일반적으로 사용되는 정렬 알고리즘이 많이 있습니다. 일반 정렬에 가장 자주 사용되는 두 가지는 Quicksort 및 merge sort 입니다. Quicksort는 종종 두 가지 중 더 빠르지 만 병합 정렬에는 전체적으로 더 나은 선택을 할 수있는 몇 가지 좋은 속성이 있습니다. 병합 정렬은 안정적 이지만 Quicksort는 그렇지 않습니다. 두 알고리즘 모두 병렬화 가능하지만 병합 정렬이 작동하는 방식은 병렬 구현을 더 효율적으로 만들고 나머지는 모두 동일합니다.
특정 JavaScript 인터프리터는 이러한 알고리즘 중 하나 또는 완전히 다른 것을 사용할 수 있습니다. 인 ECMAScript 표준은 산법을 지정하지 않는 순응 구현 사용해야합니다. 심지어 안정성에 대한 필요성을 명시 적으로 부인합니다.
값 쌍이 한 번에 한 쌍씩 비교됩니다. 비교되는 쌍은 구현 세부 사항입니다. 모든 브라우저에서 동일하다고 가정하지 마십시오. 콜백은 무엇이든 될 수 있습니다 (따라서 문자열이나 로마 숫자 또는 1,0, -1을 반환하는 함수를 생각 해낼 수있는 다른 모든 항목을 정렬 할 수 있습니다).
JavaScript의 종류에 대해 명심해야 할 점은 안정성이 보장되지 않는다는 것입니다.
정렬 과정에서 배열 정렬 콜백 함수가 여러 번 호출됩니까?
네, 바로 그 거예요. 콜백은 배열의 요소 쌍을 비교하는 데 필요에 따라 순서를 결정하는 데 사용됩니다. 비교 함수의 구현은 숫자 정렬을 처리 할 때 비정형 적이 지 않습니다. 의 세부 사양 거나 일부 다른 더 읽기 사이트.
정렬 과정에서 배열 정렬 콜백 함수가 여러 번 호출됩니까?
이것은 비교 정렬이므로 N 개의 항목이 주어지면 콜백 함수는 Quicksort 와 같은 빠른 정렬을 위해 평균 (N * Lg N) 번 호출되어야합니다 . 사용 된 알고리즘이 Bubble Sort 와 같은 경우 콜백 함수는 평균 (N * N) 번 호출됩니다.
비교 정렬을위한 최소 호출 수는 (N-1)이며 이는 이미 정렬 된 목록을 감지하기위한 것입니다 (즉, 스왑이 발생하지 않으면 거품 정렬에서 일찍 종료).
이 코드를 실행하십시오. 처음부터 끝까지 정확한 단계별 정렬 과정을 볼 수 있습니다.
var array=[25, 8, 7, 41]
var count = 1;
array.sort( (a,b) => {
console.log(`${count++}). a: ${a} | b: ${b}`);
return a-b;
});
console.log(array);
var array=[25, 8, 7, 41]
array.sort(function(a,b){
console.log(`a = ${a} , b = ${b}`);
return a - b
});
산출
- a = 8, b = 25
- a = 7, b = 8
- a = 41, b = 7
- a = 41, b = 8
- a = 41, b = 25
내 브라우저 (Google Chrome 버전 70.0.3538.77 (공식 빌드) (64 비트))에서 첫 번째 반복에서 인수 a는 배열 의 두 번째 요소 이고 인수 b는 배열 의 첫 번째 요소 입니다.
비교 함수가 반환되는 경우
- b보다 음수 값은 a로 앞으로 이동합니다.
- a보다 양의 값이 b로 이동합니다.
- 0 (0) a와 b는 그대로 유지됩니다.
참고 URL : https://stackoverflow.com/questions/1494713/how-does-javascripts-sort-work
'Program Club' 카테고리의 다른 글
| 이동 : 패닉 : 런타임 오류 : 유효하지 않은 메모리 주소 또는 포인터 역 참조 없음 (0) | 2020.10.19 |
|---|---|
| Django와 ReactJS-실제 사용 (0) | 2020.10.19 |
| 전체 파일 대신 한 줄을 git-checkout 할 수 있습니까? (0) | 2020.10.18 |
| 변수가 null인지 빈 문자열인지 또는 JavaScript에서 모두 공백인지 확인하는 방법은 무엇입니까? (0) | 2020.10.18 |
| Linq의 Union Vs Concat (0) | 2020.10.18 |