[java] 셸 정렬 알고리즘

셸 정렬은 비교 기반 정렬 알고리즘 중 하나로, 삽입 정렬을 기반으로 발전시킨 알고리즘입니다. 삽입 정렬과 달리 셸 정렬은 간격을 설정하여 요소를 비교하고 이동시키는 방식으로 정렬을 수행합니다. 이렇게 함으로써 요소들을 더 효율적으로 정렬할 수 있습니다.

알고리즘 동작 방식

셸 정렬 알고리즘은 다음과 같은 방식으로 동작합니다:

  1. 정렬할 배열을 길이에 따라 여러 개의 그룹으로 분할합니다. 이때 각 그룹의 요소는 일정한 간격을 가집니다. (간격은 보통 배열의 절반으로 설정합니다)
  2. 각 그룹에 대해 삽입 정렬을 수행합니다. 이때 간격만큼 떨어진 요소끼리 비교하고, 필요한 경우 위치를 조정합니다.
  3. 간격을 절반으로 줄여가며 위의 과정을 반복합니다.
  4. 간격이 1이 될 때까지 위의 과정을 반복합니다. 이때는 일반적인 삽입 정렬을 수행합니다.

예제 코드

public class ShellSort {
    public static void shellSort(int[] arr) {
        int n = arr.length;
        for (int gap = n / 2; gap > 0; gap /= 2) {
            for (int i = gap; i < n; i++) {
                int tmp = arr[i];
                int j;
                for (j = i; j >= gap && arr[j - gap] > tmp; j -= gap) {
                    arr[j] = arr[j - gap];
                }
                arr[j] = tmp;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {9, 5, 2, 7, 1};
        shellSort(arr);
        System.out.println("Sorted array: " + Arrays.toString(arr));
    }
}

위의 코드는 셸 정렬을 구현한 예시입니다. shellSort 메소드에서는 주어진 배열을 셸 정렬 알고리즘을 이용하여 정렬합니다. main 메소드에서는 예시 배열을 생성하고 셸 정렬을 수행한 후 결과를 출력합니다.

시간 복잡도

셸 정렬의 시간 복잡도는 최선, 평균, 최악의 경우 모두 O(n^2)입니다. 하지만 삽입 정렬과 비교해보면 보다 빠른 속도를 보여줍니다. 이는 간격을 줄여가며 여러 번의 정렬을 수행하기 때문입니다.

참고 자료