오봉이와 함께하는 개발 블로그

쉘 정렬(Shell Sort) 본문

알고리즘 & 자료구조 & 네트워크

쉘 정렬(Shell Sort)

오봉봉이 2021. 12. 1. 11:11
728x90

Algorithmday_4 정리 (2021.12.01 수요일)

쉘 정렬(Shell Sort)

  • 원소의 비교 연산과 먼 거리의 이동을 줄이기 위해 몇 개의 서브 리스트로 나누어 삽입 정렬 반복 수행
  • 삽입 정렬의 개념을 확대하여 일반화 시킨 정렬 방법
  • 삽입 정렬의 최대 문제점은 요소들이 이동할 때 이웃한 위치로만 이동한 것
  • 쉘 정렬에서는 요소들이 멀리 떨어진 위치로도 이동할 수 있기 때문에 쉘 정렬이 삽입 정렬보다 속도가 빠름.
  • 정렬 방법
    • 정렬에서 사용할 간격 결정
      • 전체 원소 수 n의 1/3, 다시 이것의 1/3....
      • 간격이 작아질수록 짧은 거리를 이동하고 원소 이동이 적음
    • 첫 번째 간격에 따라 서브 리스트로 분할
      • 각 서브 리스트에 대하여 삽입 정렬 수행
    • 두 번째 간격에 따라 서브 리스트로 분할
      • 각 서브 리스트에 대하여 삽입 정렬 수행
    • 마지막 간격에 따라 서브 리스트로 분할(마지막 간격은 무조건 1이다)
      • 각 서브 리스트에 대하여 삽입 정렬 수행
      • 각 모든 원소를 1개의 그룹으로 여기는 것이고 이는 삽입 정렬 그 자체이다.


쉘 정렬 예제 코드
  • ShellSort.java
public class ShellSort {
    public static void main(String[] args) {
        int [] arr = {30,60,90,10,40,80,40,20,10,60,50,30,40,90,80};
        shellSort(arr);
        System.out.println("최종");
        System.out.println(Arrays.toString(arr));
    }
    static void shellSort(int[] arr) {
        int n = arr.length;
        for(int i = n/2; i > 0; i/=2) {
            System.out.println("간격 i = " + i);
            for(int j = i; j < n; j++) { // 삽입 정렬을 위해 서브 리스트의 두 번째 값을 가지고 비교
                int index = j - i;
                int temp = arr[j];
                // 삽입 정렬 수행
                while (index >= 0 && arr[index] > temp) {
                    arr[index+i] = arr[index];
                    index -= i;
                }
                arr[index + i] = temp;
            }
            // 각 간격마다 정렬 결과
            System.out.println(Arrays.toString(arr));
            System.out.println();
        }
    }
}
728x90

'알고리즘 & 자료구조 & 네트워크' 카테고리의 다른 글

이원 합병 정렬(Two-way Merge Sort)  (0) 2021.12.01
퀵 정렬(Quick Sort)  (0) 2021.12.01
삽입 정렬(Insertion Sort)  (0) 2021.12.01
선택 정렬(Selection Sort)  (0) 2021.12.01
버블 정렬(Bubble Sort)  (0) 2021.12.01
Comments