다음 코드는이 배열을 숫자 순서로 어떻게 정렬합니까?
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)이며 이는 이미 정렬 된 목록을 감지하기위한 것입니다 (예 : 스왑이 발생하지 않는 경우 거품 정렬에서 일찍 종료).
답변
깊은 지식
결과가 음수이면 a가 b보다 먼저 정렬됩니다.
결과가 양수이면 b가 a보다 먼저 정렬됩니다.
결과가 0이면 두 값의 정렬 순서가 변경되지 않습니다.
노트:
이 코드는 정렬 메서드 내부의 단계별보기입니다.
산출:
let arr = [90, 1, 20, 14, 3, 55];
var sortRes = [];
var copy = arr.slice(); //create duplicate array
var inc = 0; //inc meant increment
copy.sort((a, b) => {
sortRes[inc] = [ a, b, a-b ];
inc += 1;
return a - b;
});
var p = 0;
for (var i = 0; i < inc; i++) {
copy = arr.slice();
copy.sort((a, b) => {
p += 1;
if (p <= i ) {
return a - b;
}
else{
return false;
}
});
p = 0;
console.log(copy +' \t a: '+ sortRes[i][0] +' \tb: '+ sortRes[i][1] +'\tTotal: '+ sortRes[i][2]);
}
답변
이 코드를 실행하십시오. 처음부터 끝까지 정확한 단계별 정렬 과정을 볼 수 있습니다.
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);