뭘 찾아보면 굳이 한참을 거슬러 올라가서 조상의 조상까지 찾아보ㅏ야하는 나쁜 습관 ..
정렬이란 무엇인가 수준까지 올라가서 찾아봤다 ^^,, ㅎ
정렬 알고리즘 Sorting Algorithm
정렬 이라는 개념 자체는 참 직관적이고 단순한 것에 반해 동작 원리가 제법 복잡해서
컴퓨터 개발 초창기부터 제법 뜨거운 감자였다고 한다.
1950년대부터 정렬 알고리즘 관련 연구가 많았다고 ,, 🤔
정렬 알고리즘은 크게 두가지로 구분 된다.
1. 비교 정렬 Comparison Sorts
2. 비비교 정렬 Non-comparison Sorts
비교 정렬
말 그대로 정렬 내 두개 요소의 크기를 비교해가면서 크기에 따라 위치를 조정하는 것.
종류가 10개도 넘게 있는데 개중 제일 자주 언급되는 것 5개만 정리해보았다.
버블 정렬 Bubble Sort
동작 원리 및 과정
1. arr[n] 이랑 arr[n+1] 비교
2. arr[n] > arr[n+1] 일 경우 교체
3. 정렬 길이 만큼 위 과정 반복
코드 예시
버블 정렬 코드는 직접 작성해보았는데, 다른 정렬 대비 좀 쉽게 느껴진다.
// 버블 정렬
const arr = [7, 2, 16, 5, 1, 4];
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length-1; j++) {
if (arr[j] > arr[j+1]) {
const temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
선택 정렬 Selection Sort
동작 원리 및 과정
1. 배열을 훑으면서 가장 작은 값을 찾는다
2. 가장 작은 값을 배열 제일 앞으로 이동 시킨다.
3. 정렬되지 않은 나머지 배열에서 1, 2 과정을 반복한다.
코드 예시
const arr = [7, 2, 16, 5, 1, 4];
for (let i = 0; i < arr.length; i++) {
let lowestValue = arr[i];
let indexOfLowestValue = i;
for (let j = i; j < arr.length; j++) {
if (arr[j] < lowestValue) {
lowestValue = arr[j];
indexOfLowestValue = j;
}
}
let temp = arr[i];
arr[i] = arr[indexOfLowestValue];
arr[indexOfLowestValue] = temp;
}
삽입 정렬 Insertion Sort
동작 원리 및 과정
1. 배열의 정렬되지 않은 부분에서 첫번째 값을
2. 정렬된 부분의 값들과 순차적으로 비교해서 올바른 위치에 배치한다.
3. 배열 길이 만큼 비교 후 배치 동작을 실행한다.
코드 예시
const arr = [7, 2, 16, 5, 1, 4];
for (let i = 1; i < arr.length; i++) {
let currentValue = arr[i]
let j
for (j = i - 1; j >= 0 && arr[j] > currentValue; j--) {
arr[j + 1] = arr[j]
}
arr[j + 1] = currentValue
}
병합 정렬 Merge Sort
동작 원리 및 과정
1. 배열을 두개의 하위 배열로 나눈다 (기존 배열의 약 절반 사이즈가 되도록)
2. 하위 배열의 크기가 1 이상이면 다시 두개로 나누고, 모든 하위 배열의 크기가 1이 될 때까지 반복한다.
3. 이웃한 두개의 하위 배열의 크기를 비교해서, 크기가 작은 수가 먼저 오도록 병합 한다.
퀵 정렬 Quick Sort
동작 원리 및 과정
1. 배열에서 정렬 기준 요소를(pivot element) 정한다.
2. 기준 요소를 제외한 나머지 값들이 기준 요소 보다 작으면 왼쪽, 크면 오른쪽에 위치하도록 분할 및 정렬한다.
3. 기준 요소를 해당 요소보다 작은 수 우측, 큰 수들 좌측에 위치 하도록 배치한다.
4. 분할 된 두 배열에 대해 1~3 과정을 반복한다.
결국 어떤 알고리즘을 사용하는 것이 좋을까 🤔
비교 정렬 중에 가장 빠른 것은 퀵 정렬이라고 한다.
버블정렬 같은 건 어떨 때 쓰면 좋을지 찾아봤는데 "정말 특수한 상황"에서 가장 빠르고 또 필요로 할 수 있다고 ,,
근데 그 특수 상황 예시가 저장된 정보를 불러오는데 메모리 키가 너무 커서 혹은 메모리가 너무 작아서
딱! 2개에만 접근 할 수 있는 그런 상황이라고 구체적으로 적혀있었다 ^^ ㅎ
컴퓨터 처음 나온 시절에는 충분히 연구할 가치가 있었을거라고 ,,,
즉, 지금은 딱히 쓸 필요는 없고 퀵 정렬이 제일 효율이 좋은 것이 통설로 보인다.
'알고리즘' 카테고리의 다른 글
[알고리즘/node.js] 백준 16953 A → B (0) | 2024.12.16 |
---|---|
[알고리즘/node.js] 백준 1541 잃어버린 괄호 (0) | 2024.12.12 |