본문 바로가기

IT/알고리즘

정렬 알고리즘이란?

반응형

정렬 알고리즘은 주어진 데이터 집합을 특정한 순서로 정렬하는 알고리즘이다. 데이터 정렬은 컴퓨터 과학과 다양한 응용 분야에서 매우 중요한 작업 중 하나이며, 데이터를 검색하고 분석하기 쉽게 만들어준다. 아래에는 몇 가지 대표적인 정렬 알고리즘에 대한 설명을 제공한다.

버블 정렬 (Bubble Sort)

버블 정렬은 인접한 두 요소를 비교하고 필요한 경우 위치를 교환하는 방식으로 동작한다.
리스트의 처음부터 끝까지 반복하면서 가장 큰 요소가 맨 뒤로 이동한다.
이러한 과정을 반복하며 전체 리스트를 정렬한다.
버블 정렬은 간단하고 이해하기 쉬우며 구현하기 간단하지만, 큰 데이터 집합에서는 비효율적이다.

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

# 예시 데이터
data = [64, 34, 25, 12, 22, 11, 90]

bubble_sort(data)
print("버블 정렬 결과:", data)

삽입 정렬 (Insertion Sort)

삽입 정렬은 리스트를 정렬된 부분과 정렬되지 않은 부분으로 나누고, 정렬되지 않은 요소를 정렬된 부분에 삽입하는 방식으로 동작한다.
리스트의 각 요소를 하나씩 선택하여 이미 정렬된 부분과 비교하면서 적절한 위치에 삽입한다.
삽입 정렬은 작은 데이터 집합에서는 효율적이며, 리스트가 이미 거의 정렬되어 있는 경우 더욱 효과적이다.

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key

# 예시 데이터
data = [64, 34, 25, 12, 22, 11, 90]

insertion_sort(data)
print("삽입 정렬 결과:", data)

퀵 정렬 (Quick Sort)

퀵 정렬은 분할 정복 방식을 사용하여 동작한다.
리스트에서 피벗(pivot)을 선택하고 피벗을 기준으로 작은 요소와 큰 요소로 나눈다.
각 부분 리스트에 대해 재귀적으로 퀵 정렬을 적용하고, 이를 결합하여 정렬을 완성한다.
퀵 정렬은 대부분의 경우에서 빠른 속도를 보이며, 정렬된 데이터에서도 효율적으로 동작한다.

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)

# 예시 데이터
data = [64, 34, 25, 12, 22, 11, 90]

sorted_data = quick_sort(data)
print("퀵 정렬 결과:", sorted_data)

병합 정렬 (Merge Sort)

병합 정렬도 분할 정복 방식을 사용하며, 리스트를 반으로 나눈 후 병합하는 방식으로 동작한다.
각 부분 리스트를 재귀적으로 정렬하고, 정렬된 부분 리스트를 병합하여 최종 정렬을 얻는다.
병합 정렬은 안정적이며 대규모 데이터에 대해 효과적으로 동작한다.

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        left_half = arr[:mid]
        right_half = arr[mid:]

        merge_sort(left_half)
        merge_sort(right_half)

        i = j = k = 0

        while i < len(left_half) and j < len(right_half):
            if left_half[i] < right_half[j]:
                arr[k] = left_half[i]
                i += 1
            else:
                arr[k] = right_half[j]
                j += 1
            k += 1

        while i < len(left_half):
            arr[k] = left_half[i]
            i += 1
            k += 1

        while j < len(right_half):
            arr[k] = right_half[j]
            j += 1
            k += 1

# 예시 데이터
data = [64, 34, 25, 12, 22, 11, 90]

merge_sort(data)
print("병합 정렬 결과:", data)

힙 정렬 (Heap Sort)

힙 정렬은 이진 힙(Heap) 자료 구조를 기반으로 동작한다.
힙은 최대 힙(부모 노드가 자식 노드보다 큰) 또는 최소 힙(부모 노드가 자식 노드보다 작은)으로 구성된다.
힙 정렬은 힙을 구성하고 루트 노드를 추출하여 정렬하는 방식으로 동작하며, 빠른 정렬 속도를 제공한다.

def heapify(arr, n, i):
    largest = i
    left_child = 2 * i + 1
    right_child = 2 * i + 2

    if left_child < n and arr[left_child] > arr[largest]:
        largest = left_child

    if right_child < n and arr[right_child] > arr[largest]:
        largest = right_child

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)

    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

# 예시 데이터
data = [64, 34, 25, 12, 22, 11, 90]

heap_sort(data)
print("힙 정렬 결과:", data)


이 외에도 다양한 정렬 알고리즘이 존재하며, 선택한 알고리즘은 데이터 크기, 정렬된 상태, 알고리즘의 구현 및 사용 사례에 따라 달라질 수 있다. 따라서 문제의 요구사항과 상황에 맞게 적절한 정렬 알고리즘을 선택하는 것이 중요하다.

 

 

반응형

'IT > 알고리즘' 카테고리의 다른 글

검색 알고리즘이란?  (4) 2023.10.10
알고리즘이란?  (2) 2023.10.10