강의: 구름에듀 "안경잡이개발자가 알려주는 실전 알고리즘 강좌"
링크: 안경잡이개발자가 알려주는 실전 알고리즘 강좌
(강의는 알고리즘 풀이를 C/C++ 언어로 진행합니다.)
대체로 알고리즘을 공부할 때 가장 먼저 나오는 개념이 정렬 알고리즘인 이유는 효율성의 차이를 가장 극명하게 보여주기 때문
옆에 있는 값과 비교하여 더 작은 값을 앞으로 보내는 알고리즘
인덱스가 0인 요소와 인덱스가 1인 요소를 비교하여 더 작은 값을 앞으로 보낸다.
인덱스가 1인 요소와 인덱스가 2인 요소를 비교하여 더 작은 값을 앞으로 보낸다.
...
인덱스가 8인 요소와 인덱스가 9인 요소를 비교하여 더 작은 값을 앞으로 보낸다.
(-> 가장 큰 수가 가장 뒤로 이동, 즉 인덱스가 9인 요소는 건들필요 없음)
인덱스가 0인 요소와 인덱스가 1인 요소를 비교하여 더 작은 값을 앞으로 보낸다.
인덱스가 1인 요소와 인덱스가 2인 요소를 비교하여 더 작은 값을 앞으로 보낸다.
...
인덱스가 7인 요소와 인덱스가 8인 요소를 비교하여 더 작은 값을 앞으로 보낸다.
(-> 가장 큰 수가 가장 뒤로 이동, 즉 인덱스가 8인 요소는 건들필요 없음)
마지막까지 반복,,,
function swap (i, j, arr) {
const temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
function solution (arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(j, j + 1, arr);
}
}
}
return arr;
}
console.log(solution(arr1));
여기서 불필요한 비교를 줄이기!
i 변수를 가진 for문이 실행되고 그 안에 j 변수를 가진 for문이 실행될 때,
만약 j 변수를 가진 for 문에서 한번도 swap 함수가 호출이 안됐다면 이미 정렬되어 있음을 알 수 있다.
function swap (i, j, arr) {
const temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
function solution (arr) {
for (let i = 0; i < arr.length; i++) {
// swap 함수가 호출됐는지 안됐는지 확인하는 조건
let isSwapped = false;
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
isSwapped = true;
swap(j, j + 1, arr);
}
}
// 만약 swap 함수가 호출되지 않았다면 for문 중지
if (!isSwapped) {
break;
}
}
return arr;
}
console.log(solution(arr1));
BigO
- Worst Case(정렬이 하나도 안되어있는 경우): O(N^2)
- Best Case(이미 정렬이 되어있는 경우): O(N)