[c++] 쉘 정렬

쉘 정렬은 삽입 정렬을 개선한 알고리즘으로, Donald Shell이 1959년에 발표했습니다.

개요

쉘 정렬은 삽입 정렬을 단계적으로 적용하여 부분 리스트를 정렬하는 방식으로 동작합니다. 리스트의 요소들을 일정한 간격(인터벌)으로 묶어 부분 리스트를 만든 후, 각 부분 리스트를 삽입 정렬을 이용하여 정렬합니다. 이후에는 간격을 줄이면서 계속해서 부분 리스트를 정렬하고, 마지막에는 간격을 1로 설정하여 전체 리스트를 최종적으로 정렬합니다.

예시

다음은 C++로 구현된 간단한 쉘 정렬의 예시입니다.

#include <iostream>
using namespace std;

void shellSort(int arr[], int n) {
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i += 1) {
            int temp = arr[i];
            int j;
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
        }
    }
}

int main() {
    int arr[] = {12, 34, 54, 2, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    shellSort(arr, n);
    cout << "정렬된 배열: \n";
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    return 0;
}

시간 복잡도

쉘 정렬의 시간 복잡도는 입력 데이터의 상태에 따라 다르지만, 일반적으로 O(n log^2 n) 보다는 빠르고, 삽입 정렬보다 빠르며, 성능이 괜찮은 정렬 알고리즘이라고 할 수 있습니다.

결론

쉘 정렬은 삽입 정렬의 장단점을 보완한 알고리즘으로, 중간단계의 리스트가 정렬되어 있기 때문에 비교적 빠른 정렬 알고리즘 중 하나입니다. 어느 정도 크기의 리스트에서도 효율적으로 동작하므로, 정렬 알고리즘을 선택할 때 고려해볼 만 합니다.

더 많은 정보를 원하신다면 다음 참고문헌을 참조하시기 바랍니다.