선택 정렬, 버블 정렬, 삽입 정렬은 시간 복잡도 O(n^2)로 비효율적인 정렬 알고리즘입니다.
선택 정렬
- 선택 정렬은 매 단계에서 가장 작은 원소를 선택해서 앞으로 보내는 정렬 방법입니다.
- 각 단계에서 가장 작은 원소를 선택하고 현재까지 처리되지 않은 원소들 중 가장 앞의 원소와 위치를 교체합니다.
- 매 단계에서 가장 작은 것을 선택하는 데에 약 N번의 연산이 필요하다.
5 | 4 | 3 | 2 | 1 |
1단계: 첫 단계에서 제일 작은 수는 1입니다.
1 | 5 | 4 | 3 | 2 |
2단계: 그 다음 제일 작은 수는 2입니다.
1 | 2 | 5 | 4 | 3 |
3단계: 그 다음 제일 작은 수는 3입니다.
1 | 2 | 3 | 5 | 4 |
4단계: 마지막으로 제일 작은 수는 4입니다.
1 | 2 | 3 | 4 | 5 |
const selectSolution = (arr) => {
for (let i = 0; i < arr.length; i++) {
let minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) minIndex = j;
}
let temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
};
버블 정렬
- 단순히 인접한 두 원소를 확인하여, 정렬이 안 되어 있다면 위치를 서로 변경한다.
- 각 단계에서는 인접한 두 개의 원소를 비교하여, 필요시 위치를 변경한다.
- 비교해서 나온 마지막 정렬을 고정하고, 다시 비교하여 정렬한다.
[단계 별]
0의 자리와 1의 자리를 비교한다.0의자리가 작아서 고정한다.
5 | 8 | 2 | 4 |
1과 2의 자리를 비교한다. 2의 자리가 작아서 자리를 변경해준다.
5 | 2 | 8 | 4 |
2과 3의 자리를 비교한다. 3의 자리가 더 작아서 자리를 변경해준다.
5 | 2 | 4 | 8 |
이 방법을 반복하여 변경해준다.
const bubbleSolution = (arr) => {
for (let i = arr.length - 1; i > 0; i--) {
for (let j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
//오름차순
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
};
let list = [8, 2, 3, 4];
console.log(bubbleSolution(list));
삽입 정렬
- 각 단계에서 현재 원소가 삽입될 위치를 찾는다.
- 적절한 위치에 도달 할 때까지 반복적으로 왼쪽으로 이동한다.
2 | 3 | 1 | 5 | 6 |
[1단계] 첫번째는 정렬되었다고 판단하고, 3이 2보다 크기 때문에 그대로 정렬된다.
2 | 3 | 1 | 5 | 6 |
[2단계] 1이 2,3보다 작기 때문에 맨 앞으로 정렬된다.
1 | 2 | 3 | 5 | 6 |
[3단계] 5가 3보다 크기 때문에 그대로 고정한다.
1 | 2 | 3 | 5 | 6 |
[4단계] 6이 5보다 크기 때문에 그대로 고정한다.
1 | 2 | 3 | 5 | 6 |
const insertionSort = (arr) => {
for (let i = 1; i < arr.length; i++) {
for (let j = i; j > 0; j--) {
if (arr[j] < arr[j - 1]) {
let temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
} else {
break;
}
}
}
return arr;
};
let list = [8, 2, 3, 4];
console.log(insertionSort(list));
'알고리즘' 카테고리의 다른 글
[JS 알고리즘] 특정 범위에 해당하는 원소 개수 구하기(lowerBound,upperBound) (1) | 2023.12.27 |
---|---|
[JS 알고리즘] 순차 탐색과 이진 탐색 (1) | 2023.12.26 |
[JS 알고리즘] 백준 17609 (0) | 2023.12.07 |
[js 알고리즘] 백준 9009: 피보나치 (0) | 2023.11.28 |
[JS 알고리즘] 병합 정렬이란? (0) | 2023.11.22 |