정렬되지 않은 배열이 주어졌을 때, 어떻게 오름차순으로 정렬할 수 있을까?
2 | 1 | 3 | 4 |
---|---|---|---|
↑ | ↑ |
1 | 2 | 3 | 4 |
---|---|---|---|
↑ | ↑ |
1 | 2 | 3 | 4 |
---|
예제를 통해서 버블 정렬를 해보자!
배열 [4,7,2,1,9]
4 | 7 | 2 | 1 | 9 |
---|---|---|---|---|
↑ | ↑ |
4 | 7 | 2 | 1 | 9 |
---|---|---|---|---|
↑ | ↑ |
4 | 2 | 7 | 1 | 9 |
---|---|---|---|---|
↑ | ↑ |
4 | 2 | 1 | 7 | 9 |
---|
1 | 2 | 4 | 7 | 9 |
---|
function bubble_sort(list) {
let unsorted_until_index = list.length - 1;
let sorted = false;
while (!sorted) {
sorted = true;
for (let i = 0; i < unsorted_until_index; i++) {
if (list[i] > list[i + 1]) {
// 배열 요소를 교환할 때, 임시 변수 temp를 사용하여 두 값을 서로 교환
let temp = list[i];
list[i] = list[i + 1];
list[i + 1] = temp;
sorted = false;
}
}
// 반복문이 한 번 완료되면 가장 큰 값이 배열의 끝으로 이동했으므로
// 다음 반복에서는 마지막 인덱스는 무시해도 됩니다.
unsorted_until_index -= 1;
}
return list;
}
배열 N개의 원소가 있을 때 모든 값이 정렬되지 않았을 경우,
비교와 교환이 원소 수가 증가할수록 기하급수적으로 증가한다. 다음 표로 원소 개수에 따라 최대 단계 수를 알 수 있다.
데이터 원소 N개 | 최대 단계 수 |
---|---|
5 | 20 |
10 | 90 |
20 | 380 |
40 | 1560 |
80 | 6320 |
N이 증가할 때마다 대략 N^2만큼 늘어남을 알게 된다.
데이터 원소 N개 | 최대 단계 수 | N^2 |
---|---|---|
5 | 20 | 25 |
10 | 90 | 100 |
20 | 380 | 400 |
40 | 1560 | 1600 |
80 | 6320 | 6400 |
버블 정렬의 시간 복잡도를 빅 오 표기법으로 나타내면, O(N^2)이라고 할 수 있다. 그래프에서 O(N)보다 더 가파른 기울기를 갖는다. O(N^2)을 이차 시간이라고 부른다.
중첩 for문은 배열 N개 값이 있을 때, 1차 for문에서 N번, 2차 for문에서 N번 순회하기 때문에 O(N^2) 시간복잡도를 갖는다. 그렇기 때문에 중첩 for문을 사용할 때는 성능 면에서 좋지 않을 수 있다.
function checkDuplicate (array) {
for (let i=0; i<array.length; i++) {
for (let j=0; i<array.length; j++) {
if (i !==j && array[i] === array[j]) {
return true;
}
}
}
return false;
}
중첩 for 문을 사용하지 않고 더 나은 시간복잡도가 나오도록 선형 해결법을 사용해보자.
function checkDuplicate(array) {
let existingNumber = [];
for (let i=0; i<array.length;i++){
if (existingNumber[array[i]] === 1) {
return true;
} else {
existingNumber[array[i]] === 1
}
}
return false
}
선형 해결법은 array를 모두 순회하기 때문에 O(N) 시간복잡도가 걸린다.
O(N)이 O(N^2)보다 효율적이다.
1. 100개일 때,
O(N) 7단계
O(N^2) 알고리즘이라면 약 10,000단계의 시간
2. 2000개일 때,
O(N) 11단계
O(N^2) 알고리즘이라면 약 4,000,000단계의 시간
256 = n^2
n^2 = 256
n = √256
n = 16
function greatesNumber(array) {
let answer = 0;
for(let i=0; i<array.length; i++) {
if (answer < array[i]) {
answer = array[i];
}
}
return answer;
}