본문 바로가기
CS/Algorithm

쉘 정렬 (Shell Sort)

by seoyamin 2022. 6. 6.

1. 쉘 정렬

간격(gap)을 이용해서 굵직굵직한 삽입정렬을 하자

 

※ 삽입정렬은 어느 정도 이미 정렬된 배열에서 효과적

    ∴   1. 간격을 이용해서 굵직굵직한 그룹별 삽입 정렬을 한다. (큰 숫자들 대충 뒤로, 작은 숫자들 대충 앞으로)

          2. 큰 틀에서 어느정도 정렬이 된 상태가 된다.

          3. 이후에 정석 삽입정렬을 해서 완벽히 정렬

 

 

※ gap

     전체 원소 수의 1/2  →  이전 gap의 1/2  →  이전 gap의 1/2  → ...... →  1

 

 

 

2. 쉘 정렬 예제

ex )  30 60 90 10 40 80 40 20 10 60 50 30 40 90 80  오름차순 정리하시오.

 

#include <stdio.h>

void shellSort(int arr[], int len) {
    
    for(int h=len/2 ; h>0 ; h/=2) {
        
        for(int i=0 ; i<h ; i++) {
            
            for(int j=h+i ; j<len ; j+=h) {   // i번째 그룹 삽입정렬 현재 주자 temp = arr[j] 
            // temp는 i번째 그룹의 index = 1인 2nd 원소 (원래 삽입 정렬은 index = 1 부터가 첫번째 주자)
                int temp = arr[j];
                int idx = j;            
                
                
                // 하극상인 애 나올때까지 현재 주자 바로 앞 부분을 h간격으로 하나씩 살펴보기
                // 하극상 발견되면 현재 주자랑 하극상 자리 바꾸기 (삽입)
                // 바꾸고 나서도 바로 앞 부분을 h간격으로 살펴보며 또 하극상인 애 있는지 확인 후 반복
                while(arr[idx-h] > temp && idx >= h) {   
                    arr[idx] = arr[idx-h];    
                    idx -= h;
                }
                
                arr[idx] = temp;
            }
        }
    }
    
    for(int i=0 ; i<len ; i++) {
        printf("%d ", arr[i]);
    }
}


int main() {
    int arr[] = {30, 60, 90, 10, 40, 80, 40, 20, 10, 60, 50, 30, 40, 90, 80};
    int len = sizeof(arr) / sizeof(int);
    
    shellSort(arr, len);
    
    return 0;
}

'CS > Algorithm' 카테고리의 다른 글

DFS와 BFS : (1) 기초  (0) 2022.08.28
기수 정렬 (Radix Sort)  (0) 2022.06.11
퀵 정렬 (Quick Sort)  (0) 2022.05.09
삽입 정렬 (Insertion Sort)  (0) 2022.05.06
버블 정렬 (Bubble Sort)  (0) 2022.05.04