Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 구현하는 스튜지 정렬(Stooge Sort) 프로그램

이 글에서는 아래의 문제에 대한 해결 방법을 단계별로 알아보겠습니다.

문제 정의 – 하나의 배열이 주어졌을 때, 스튜지 정렬(Stooge Sort) 알고리즘을 사용하여 해당 배열을 오름차순으로 정렬해야 합니다.

스튜지 정렬이란?

스튜지 정렬은 재귀적으로 동작하는 비교 기반 정렬 알고리즘입니다. 시간 복잡도가 O(n^(log 3 / log 1.5)) ≈ O(n2.71)로 매우 비효율적이기 때문에 실무에서는 거의 사용되지 않지만, 재귀 호출과 분할 정복 개념을 학습하는 데 좋은 예제가 됩니다.

알고리즘

1. 인덱스 0의 값이 마지막 인덱스의 값보다 크면 두 값을 서로 교환한다.
2. 배열의 앞쪽 2/3 부분을 정렬한다.
3. 배열의 뒤쪽 2/3 부분을 정렬한다.
4. 앞쪽 2/3 부분을 다시 한 번 정렬하여 최종적으로 확인한다.

그럼 아래 구현된 코드를 통해 해결 과정을 살펴보겠습니다.

예제 코드

def stoogesort(arr, l, h):
    if l >= h:
        return
    # 두 값을 교환(swap)
    if arr[l] > arr[h]:
        t = arr[l]
        arr[l] = arr[h]
        arr[h] = t
    # 원소가 2개보다 많은 경우
    if h-l+1 > 2:
        t = (int)((h-l+1)/3)
        # 앞쪽 2/3 요소 정렬
        stoogesort(arr, l, (h-t))
        # 뒤쪽 2/3 요소 정렬
        stoogesort(arr, l+t, (h))
        # 앞쪽 2/3 요소를 다시 정렬하여 확인
        stoogesort(arr, l, (h-t))
# 메인 실행부
arr = [1,4,2,3,6,5,8,7]
n = len(arr)
stoogesort(arr, 0, n-1)
print ("정렬된 수열:")
for i in range(0, n):
    print(arr[i], end = " ")

실행 결과

정렬된 수열:
1 2 3 4 5 6 7 8

파이썬으로 구현하는 스튜지 정렬(Stooge Sort) 프로그램

위 코드에서 사용된 모든 변수는 지역 범위(local scope) 내에서 선언되며, 각 변수의 참조 관계는 위 그림에서 확인할 수 있습니다.

동작 원리 요약

함수 stoogesort(arr, l, h)는 배열 arr의 인덱스 l부터 h까지의 구간을 정렬합니다. 먼저 양 끝의 값을 비교하여 필요하면 교환한 뒤, 구간의 길이가 2보다 클 경우 전체 길이의 1/3만큼을 계산하여 앞쪽 2/3과 뒤쪽 2/3 구간에 대해 재귀적으로 정렬을 수행하고, 마지막으로 앞쪽 2/3 구간을 한 번 더 정렬함으로써 정확성을 보장합니다.

결론

이 글에서는 파이썬으로 스튜지 정렬(Stooge Sort)을 구현하는 방법에 대해 알아보았습니다. 스튜지 정렬은 효율성 면에서는 뒤떨어지지만, 재귀적 사고방식과 분할 정복 기법을 이해하는 데 유용한 학습용 알고리즘이라는 점을 기억해 두시기 바랍니다.