[javascript] 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 인터프리터에는 일종의 정렬 알고리즘 구현이 내장되어 있습니다. 정렬 작업 중에 몇 번 비교 함수를 호출합니다. 비교 함수가 호출되는 횟수는 특정 알고리즘, 정렬 할 데이터 및 정렬 전 순서에 따라 다릅니다.

일부 정렬 알고리즘은 일반적인 경우보다 훨씬 더 많은 비교를 수행하기 때문에 이미 정렬 된 목록에서 제대로 수행되지 않습니다. 다른 사람들은 미리 정렬 된 목록에 잘 대처하지만 실적이 저조하도록 “속일 수있는”다른 경우가 있습니다.

단일 알고리즘이 모든 목적에 완벽하지 않기 때문에 일반적으로 사용되는 정렬 알고리즘이 많이 있습니다. 일반 정렬에 가장 자주 사용되는 두 가지는 Quicksortmerge 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);