삽입정렬
시간 복잡도
장점
단점
정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴한다
const insertionSort = function (arr, transform = (item) => item) {
// 두 번째 인덱스 수부터 바로 앞 인덱스의 값과 비교하여 정렬한다.
let aux = [arr[0]];
// 비교할 첫 번째 요소는 따로 선언해 놓는다.
for(let i = 1; i < arr.length; i++) {
if (transform(arr[i]) >= transform(aux[i - 1])) {
// 현재 요소 값이 비교할 앞 인덱스의 요소보다 크면, 현재 요소 값을 따로 선언한 배열에 push한다.
aux.push(arr[i])
}
else {
for (let j = 0; j < i; j++) {
// 그렇지 않은 경우 aux의 배열의 길이만큼 (i의 숫자 크기만큼) for문을 돌려
if (transform(arr[i]) <= transform(aux[j])) {
// aux의 전체 요소값 중에 현재 요소 값보다 큰 값이 있는 경우
const left = aux.slice(0, j);
// 해당 현재 요소 값을 해당 큰 값 바로 앞에 끼워 넣어야 한다.
// 큰 값 바로 앞 left
const right = aux.slice(j);
// 큰 값 바로 뒤 right로 선언하고
aux = left.concat(arr[i], right)
// 사이에 현재 요소 값을 넣어 준다.
break;
// swap한 후 else 반복문을 멈춘다.
}
}
}
}
return aux
};
삽입 정렬에 대해 공부를 하고 요소의 값을 비교하며 swap하는 방식으로 문제를 풀을려고 했지만 advanced 풀이가 잘 되지 않았다. 결국 레퍼런스를 참조했다.
- 레퍼런스 코드는 인자로 받은 배열의 요소의 자리를 바꾸는 방식보다는, 따로 aux 배열을 만들었고 인자로 받은 배열의 첫 번째 요소를 넣어 놓고 실제 인자 배열에는 두 번째 요소부터 확인을 한다.
- callback 함수
transform = (item) => item
로 넣는 것이 아직 확실하게 이해가 되지 않지만, 현재 callback의 경우 인자를 값으로 그대로 리턴하기 때문에 callback 함수가 따로 밖에서 지정되지 않을 경우에도 함수 내부의 식이 제대로 돌아가고, 따로 밖에서 지정이 되면 그 callback으로 내부의 식이 돌아간다고 이해가 되었다.