본 시리즈는 프로그래밍 알고리즘의 개념을 정리하고 실습을 진행해보는 시리즈입니다.
단순 정렬(Basic Sorting) 알고리즘은 기본적인 정렬 방식으로, 구현이 간단하고 상대적으로 이해하기 쉽습니다.
단순 정렬 알고리즘은 비교 기반 정렬로, 배열이나 리스트의 요소를 차례로 비교하며 정렬을 수행합니다.
대표적인 단순 정렬 알고리즘으로는 버블 정렬 (Bubble Sort), 선택 정렬 (Selection Sort), 삽입 정렬 (Insertion Sort) 등이 있으며, 이들은 주로 교육용이나 작은 데이터셋에 적합합니다.
다만, 실무 관점에서는 이 중에서 가장 중요하다 여겨지는 알고리즘은 삽입 정렬 (Insertion Sort)이라 볼수 있습니다.
- 다양한 프로그래밍 언어에서 일반적으로 작은 길이의 데이터에 대한 표준 정렬 알고리즘으로 가장 많이 쓰이는 방식이기 때문입니다.
버블 정렬 (Bubble Sort)은 가장 간단한 정렬 알고리즘 중 하나로, 인접한 두 요소를 반복적으로 비교하여, 잘못된 순서의 요소들을 교환하며 정렬하는 방식입니다.
Bubble Sort는 비교 기반 정렬 알고리즘으로, 주어진 배열이나 리스트에서 인접한 두 요소를 비교하여 크기가 잘못된 경우 교환합니다.
Bubble Sort는 다음과 같은 순서로 동작합니다:
주어진 배열 [9, 2, 1, 5, 4]
를 Bubble Sort로 정렬하는 과정:
9
가 배열의 맨 끝으로 이동9
는 이미 정렬되었으므로, 남은 부분을 정렬import java.util.Arrays;
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int n = arr.length;
// 배열 전체에 대해 반복
for (int i = 0; i < n - 1; i++) {
// 마지막 i개의 요소는 이미 정렬되었으므로 비교할 필요 없음
for (int j = 0; j < n - i - 1; j++) {
// 인접한 두 요소 비교
if (arr[j] > arr[j + 1]) {
// 두 요소를 교환
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] arr = {9, 2, 1, 5, 4};
bubbleSort(arr);
System.out.println("Sorted array: " + Arrays.toString(arr));
}
}
Java 구현 설명:
출력 예시:
Sorted array: [1, 2, 4, 5, 9]
def bubble_sort(arr):
n = len(arr)
# 배열 전체에 대해 반복
for i in range(n-1):
# 마지막 i개의 요소는 이미 정렬되었으므로 비교할 필요 없음
for j in range(n-1-i):
# 인접한 두 요소 비교
if arr[j] > arr[j+1]:
# 두 요소를 교환
arr[j], arr[j+1] = arr[j+1], arr[j]
# 예시 배열
arr = [9, 2, 1, 5, 4]
bubble_sort(arr)
print("Sorted array:", arr)
Python 구현 설명:
arr[j], arr[j+1] = arr[j+1], arr[j]
) 가능합니다.출력 예시:
Sorted array: [1, 2, 4, 5, 9]
선택 정렬 (Selection Sort)은 배열에서 가장 작은(또는 가장 큰) 요소를 반복적으로 선택하여, 정렬되지 않은 부분의 맨 앞 요소와 교환하는 방식으로 정렬하는 알고리즘입니다. 이 과정이 끝날 때마다 배열의 일부가 정렬됩니다.
Selection Sort는 비교 기반 정렬 알고리즘으로, 가장 작은 요소를 반복적으로 찾아 배열의 앞부분에 배치합니다.
Selection Sort는 다음과 같은 순서로 동작합니다:
동작 예시:
주어진 배열 [9, 2, 1, 5, 4]
를 Selection Sort로 정렬하는 과정:
1
을 찾아 맨 앞 요소 9
와 교환[2, 9, 5, 4]
에서 가장 작은 값 2
는 이미 제자리에 있음[9, 5, 4]
에서 가장 작은 값 4
를 찾아 9
와 교환[5, 9]
에서 정렬 완료import java.util.Arrays;
public class SelectionSort {
public static void selectionSort(int[] arr) {
int n = arr.length;
// 배열 전체에 대해 반복
for (int i = 0; i < n - 1; i++) {
// 현재 구간에서 가장 작은 요소 찾기
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 가장 작은 요소를 현재 구간의 맨 앞 요소와 교환
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
public static void main(String[] args) {
int[] arr = {9, 2, 1, 5, 4};
selectionSort(arr);
System.out.println("Sorted array: " + Arrays.toString(arr));
}
}
Java 구현 설명:
출력 예시:
Sorted array: [1, 2, 4, 5, 9]
def selection_sort(arr):
n = len(arr)
# 배열 전체에 대해 반복
for i in range(n-1):
# 현재 구간에서 가장 작은 요소 찾기
min_index = i
for j in range(i+1, n):
if arr[j] < arr[min_index]:
min_index = j
# 가장 작은 요소를 현재 구간의 맨 앞 요소와 교환
arr[i], arr[min_index] = arr[min_index], arr[i]
# 예시 배열
arr = [9, 2, 1, 5, 4]
selection_sort(arr)
print("Sorted array:", arr)
Python 구현 설명:
arr[i], arr[min_index] = arr[min_index], arr[i]
)합니다.출력 예시:
Sorted array: [1, 2, 4, 5, 9]
단순 정렬 알고리즘들은 구현이 쉽고 이해하기 간단하지만, 대규모 데이터에서는 비효율적일 수 있습니다.
알고리즘 | 시간 복잡도 (최악, 평균) | 공간 복잡도 | 특징 |
---|---|---|---|
Bubble Sort | 구현이 간단하지만 비교 및 교환이 빈번하게 발생 | ||
Selection Sort | 교환 횟수는 적지만, 비교 횟수는 많음 | ||
Insertion Sort | (최선 ) | 작은 배열이나 이미 정렬된 배열에서 효율적 |
이들 알고리즘은 모두 작은 배열에서의 사용에 적합하며, 대규모 데이터에서는 보다 효율적인 정렬 알고리즘을 사용하는 것이 바람직합니다.
이번 포스팅에서는 대표적인 단순 정렬 알고리즘인 버블 정렬과 선택 정렬을 다루었습니다.
다음 포스팅에서는 단순 정렬 알고리즘 중에서 가장 활용도가 높은 삽입 정렬과 이진 삽입 정렬에 대해 다룰 예정입니다.