Algorithm/기본문제
기본 정렬(버블정렬, 선택정렬, 삽입정렬)
atsc
2021. 3. 13. 14:10
1. 버블정렬(bubble sort)
- (오름차순 기준)인접한 두 데이터를 비교하여 앞의 데이터가 뒤의 데이터보다 크다면 자리를 바꿈
- 정렬 1턴을 수행할 때마다 해당 턴의 맨 마지막 위치에 정렬이 완료된 데이터가 배치됨
- 각 턴의 마지막은 턴을 수행할 때마다 한 칸씩 앞으로 옴
- 어느 특정 턴에서 swap이 일어나지 않은 경우는 더 이상 정렬할 것이 없다는 의미이므로 이 경우 전체 정렬을 중단함
function bubbleSort(data) {
for (let i = 0; i < data.length; i++) {
let swap = false;
for (let j = 0; j < data.length - 1 - i; j++) {
if (data[j] > data[j + 1]) {
[data[j], data[j + 1]] = [data[j + 1], data[j]]
swap = true;
}
}
if (!swap) break;
}
return data;
}
2. 선택정렬(selection sort)
- 정렬 수행시 한 턴에서 데이터들 중 가장 작은 값을 찾고 각 턴에서 선택된 최소값을 턴의 맨 앞 데이터와 교체함
- 각 턴의 맨 앞 데이터는 이미 정렬이 완료된 상태이므로 다음 턴에서는 그 다음 데이터부터 마지막 데이터까지 동일한 작업을 수행
function selectionSort(data) {
for (let i = 0; i < data.length - 1; i++) {
let lowest = i;
for (let j = i + 1; j < data.length; j++) {
if (data[lowest] > data[j])
lowest = j;
}
[data[lowest], data[i]] = [data[i], data[lowest]];
}
return data;
}
3. 삽입정렬(insertion sort)
- 두 번째 인덱스부터 시작함
- 해당 인덱스 값(key)의 앞에 있는 데이터(target)부터 비교, key 값이 더 작으면 target 값을 뒤 인덱스로 복사, 이를 target 값보다 key 값이 더 큰 경우까지 반복하여 해당 target 위치 바로 뒤에 key 값을 이동시킴
- 맨 처음 턴에서 첫 번째 값이 target이 되고 두 번째 값이 key값이 됨
- key값은 차례로 앞의 값들끼리 비교하면서 앞부분 값 중 key보다 작은 target값이 있다면 검사를 멈추고 해당 target 다음 위치에 key 값을 배치함
function insertionSort(data) {
for (let i = 1; i < data.length; i++) {
let tmp = data[i];
let j = i - 1;
while (j >= 0) {
if (data[j] > tmp) {
data[j + 1] = data[j];
} else {
break;
}
j--;
}
data[j + 1] = tmp;
}
return data;
}