컴퓨터공학

정렬 알고리즘 비교 (버블 정렬, 퀵 정렬, 병합 정렬)

nyambu 2025. 3. 15. 18:30

정렬 알고리즘 비교
정렬 알고리즘 비교

1. 정렬 알고리즘이란?

정렬 알고리즘은 주어진 데이터 집합을 오름차순 또는 내림차순으로 정렬하는 방법을 의미한다. 정렬 방식에 따라 성능 차이가 크며, 상황에 따라 적합한 알고리즘을 선택하는 것이 중요하다. 정렬 알고리즘의 성능은 **시간 복잡도(Time Complexity)**와 **공간 복잡도(Space Complexity)**를 기준으로 평가된다.

 

  • 시간 복잡도: 데이터 개수(n)에 따른 연산 횟수 (Best / Average / Worst Case 분석)
  • 공간 복잡도: 추가적으로 필요한 메모리 사용량

2. 버블 정렬 (Bubble Sort)

 버블 정렬은 가장 단순한 정렬 알고리즘 중 하나로, 인접한 두 개의 데이터를 비교하여 큰 값을 뒤로 보내는 방식을 반복한다. 즉, 가장 큰 값이 거품처럼 위로 올라가는 방식이기 때문에 "버블 정렬"이라는 이름이 붙었다.

2-1. 알고리즘 과정

  1. 리스트의 첫 번째 요소부터 인접한 두 개의 값을 비교한다.
  2. 앞의 값이 더 크면 위치를 바꾼다.
  3. 한 바퀴 순회하면 가장 큰 값이 맨 끝으로 이동한다.

위 과정을 리스트 크기 - 1 만큼 반복한다.

 

2-2. 코드 예제 (Python)

def bubble_sort(arr):
    n = len(arr)
    for i in range(n - 1):
        for j in range(n - 1 - i):
            if arr[j] > arr[j + 1]:  
                arr[j], arr[j + 1] = arr[j + 1], arr[j]  
    return arr

arr = [5, 3, 8, 4, 2]
print(bubble_sort(arr))  # 출력: [2, 3, 4, 5, 8]

 

2-3. 시간 복잡도

최선의 경우(Best)
평균(Average) 최악(Worst)
O(n) O(n²) O(n²)
  • 최선의 경우 (이미 정렬되어 있는 경우)에는 한 번만 비교하고 종료 → O(n)

일반적인 경우 및 최악의 경우에는 O(n²)으로 매우 비효율적

 

2-4. 버블 정렬의 장단점

장점:

  • 코드가 단순하고 이해하기 쉽다.
  • 데이터의 크기가 작은 경우 사용할 수 있다.

단점:

  • **시간 복잡도가 O(n²)**으로, 데이터가 많을수록 비효율적이다.
  • 정렬 속도가 매우 느려 실무에서 거의 사용되지 않는다.

3. 퀵 정렬 (Quick Sort)

 퀵 정렬은 분할 정복(Divide and Conquer) 기법을 사용하여 데이터를 정렬하는 방법이다. 특정한 기준(Pivot)을 설정하고, 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할하는 방식으로 정렬을 수행한다.

3-1. 알고리즘 과정

  1. 리스트에서 하나의 원소를 **피벗(Pivot)**으로 설정한다.
  2. 피벗을 기준으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 나눈다.
  3. 나누어진 왼쪽과 오른쪽 리스트를 각각 재귀적으로 퀵 정렬을 수행한다.
  4. 모든 정렬이 끝나면 정렬된 리스트가 완성된다.

 

3-2. 코드 예제 (Python)

def quick_sort(arr):
    if len(arr) <= 1:
        return arr  
    pivot = arr[len(arr) // 2]  # 피벗 설정
    left = [x for x in arr if x < pivot]  
    middle = [x for x in arr if x == pivot]  
    right = [x for x in arr if x > pivot]  
    return quick_sort(left) + middle + quick_sort(right)

arr = [5, 3, 8, 4, 2]
print(quick_sort(arr))  # 출력: [2, 3, 4, 5, 8]

3-3. 시간 복잡도

최선의 경우(Best)
평균(Average) 최악(Worst)
O(n log n) O(n log n) O(n²)
  • 최선과 평균의 경우 O(n log n)으로 빠른 성능을 제공
  • 최악의 경우(피벗이 계속 최솟값이나 최댓값으로 선택되는 경우)에는 O(n²)

 

3-4. 퀵 정렬의 장단점

장점:

  • 평균적으로 매우 빠른 정렬 속도를 보인다.
  • 추가적인 메모리 사용이 적다.
  • 실무에서 가장 많이 사용되는 정렬 방식 중 하나이다.

단점:

  • 최악의 경우 O(n²)로 성능이 저하될 수 있다.
  • 재귀 호출을 사용하므로, **스택 오버플로우(Stack Overflow)**가 발생할 가능성이 있다.

4. 병합 정렬 (Merge Sort)

병합 정렬은 데이터를 반으로 계속 나눈 후, 다시 합쳐가며 정렬하는 방식을 사용한다. 퀵 정렬과 마찬가지로 "분할 정복(Divide and Conquer)"을 기반으로 한다.

 

4-1. 알고리즘 과정

  1. 리스트를 반으로 나눈다.
  2. 각 부분 리스트를 재귀적으로 병합 정렬한다.
  3. 두 개의 정렬된 리스트를 하나로 합친다.
  4. 모든 리스트가 합쳐질 때까지 반복한다.

 

4-2. 코드 예제 (Python)

def merge_sort(arr):
    if len(arr) <= 1:
        return arr  
    mid = len(arr) // 2  
    left = merge_sort(arr[:mid])  
    right = merge_sort(arr[mid:])  

    sorted_arr = []
    i = j = 0  
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            sorted_arr.append(left[i])
            i += 1
        else:
            sorted_arr.append(right[j])
            j += 1
    sorted_arr += left[i:]
    sorted_arr += right[j:]
    return sorted_arr

arr = [5, 3, 8, 4, 2]
print(merge_sort(arr))  # 출력: [2, 3, 4, 5, 8]

 

4-3. 시간 복잡도

최선의 경우(Best) 평균(Average) 최악(Worst)
O(n log n) O(n log n) O(n log n)

 

4-4. 병합 정렬의 장단점

장점:

  • 최악의 경우에도 O(n log n)으로 일정한 성능 유지
  • 안정 정렬(Stable Sort)이며, 데이터의 순서를 보존할 수 있음

단점:

  • 추가적인 메모리 사용(O(n))이 필요함
  • 퀵 정렬보다 실전에서 속도가 느릴 수 있음

5. 정렬 알고리즘 비교

정렬 알고리즘 시간 복잡도 공간 복잡도 특징
버블 정렬 O(n²) O(1) 간단하지만 매우 느림
퀵 정렬 O(n log n) O(log n) 평균적으로 가장 빠름
병합 정렬 O(n log n) O(n) 안정 정렬이지만 메모리 사용 많음

6. 정렬 알고리즘 선택 기준

 정렬 알고리즘은 데이터 크기, 정렬의 필요 조건, 메모리 사용량, 속도 등에 따라 적절한 방식이 다르다. 상황별로 어떤 정렬 방식을 선택하는 것이 적절한지 살펴보자.

6-1. 데이터 크기에 따른 정렬 선택

  • 데이터가 작을 때 (n ≤ 1000)
    → 단순한 정렬도 문제없다. 버블 정렬, 삽입 정렬을 사용할 수 있음.
  • 데이터가 클 때 (n > 1000)
    → **퀵 정렬(Quick Sort) 또는 병합 정렬(Merge Sort)**이 적합함.
    → 퀵 정렬은 평균적으로 빠르고 메모리 사용량이 적어 실무에서 많이 사용됨.

 

6-2. 메모리 사용량을 고려한 정렬 선택

  • 추가적인 메모리를 적게 사용해야 할 때
    → **퀵 정렬(Quick Sort)**이 적합. 추가적인 공간 사용이 거의 없음.
  • 추가적인 메모리를 사용할 수 있을 때
    → **병합 정렬(Merge Sort)**이 적합. 다만 O(n)의 추가 메모리가 필요함.

 

6-3. 안정 정렬이 필요한 경우

  • **안정 정렬(Stable Sort)**이란?
    → 동일한 값을 가진 데이터의 기존 순서를 유지하는 정렬 방법
  • 필요한 경우: 성적순 정렬, 쇼핑몰 상품 정렬 등
  • 사용할 수 있는 정렬 알고리즘
    병합 정렬(Merge Sort), 삽입 정렬(Insertion Sort)
    → 퀵 정렬(Quick Sort)은 기본적으로 **비안정 정렬(Unstable Sort)**이므로 안정성을 보장할 수 없다.

 

6-4. 특정 환경에서의 최적 정렬 알고리즘

환경추천  알고리즘
데이터가 작고 단순한 경우 버블 정렬(Bubble Sort), 삽입 정렬(Insertion Sort)
데이터가 크고 메모리가 제한적인 경우 퀵 정렬(Quick Sort)
데이터가 크고 안정성이 중요한 경우 병합 정렬(Merge Sort)
이미 정렬된 상태에 가까운 경우 삽입 정렬(Insertion Sort)
정렬이 자주 변경되는 경우 힙 정렬(Heap Sort)

7. 정렬 알고리즘 실전 활용 사례

정렬 알고리즘은 실무에서 매우 다양한 분야에서 활용된다. 웹 서비스, 데이터베이스, 검색 엔진, 금융 시스템 등에서 정렬이 필요하다.

7-1. 웹사이트에서 상품 정렬

전자상거래 사이트에서는 상품을 가격순, 인기순, 신상품순 등 다양한 기준으로 정렬해야 한다.

  • 퀵 정렬(Quick Sort): 평균적인 속도가 빠르기 때문에 실시간 검색 및 필터링에 활용된다.
  • 병합 정렬(Merge Sort): 안정 정렬이므로 기존 정렬 순서를 유지해야 할 때 적합하다.

 

7-2. 데이터베이스 인덱스 정렬

데이터베이스에서 데이터를 효율적으로 검색하기 위해서는 정렬이 필요하다.

  • B-Tree, B+Tree 기반 정렬: 데이터베이스의 인덱스를 정렬하여 빠르게 검색 가능
  • 힙 정렬(Heap Sort): 대량의 데이터를 정렬할 때 사용되며, O(n log n)의 성능을 보장한다.

 

7-3. 검색 엔진의 결과 정렬

검색 엔진에서 키워드에 대한 검색 결과를 정렬하는 과정도 정렬 알고리즘을 활용한다.

  • 퀵 정렬(Quick Sort), 병합 정렬(Merge Sort): 효율적인 정렬을 위해 사용
  • 히프 정렬(Heap Sort): 최적의 k개 요소를 빠르게 정렬하는 데 사용됨

 

7-4. 금융 데이터 분석

금융 시스템에서는 주식 가격 변동, 거래 기록, 고객 정보 등을 빠르게 정렬하여 분석해야 한다.

  • 퀵 정렬(Quick Sort): 데이터가 많을 때 빠르게 정렬 가능
  • 병합 정렬(Merge Sort): 안정성이 필요한 데이터 정렬 시 사용