기본 개념
- h(k)를 큰 수로 놓아서 순서가 맞지 않는 키들을 장거리 이동시킴으로써 일반 삽입정렬보다 빨리 제자리에 접근시키도록 하는 정렬
- 입력 배열을 부분배열로 나누너 정렬하는 과정을 여러번 걷침
- 부분배열의 크기와 개수를 변화시켜 가면서 과정을 진행
- 부분배열의 개수를 정하기 위해 양수로 이루어진 임의의 순열 h(k), h(k-1), ....h1 을 선택
- 이 순열에서 1<i<k 인 i 에 대하여 h(i-1) < h(i) < h(i=1) 이 항상 만족되도록 함
- 또한 임의의 i와 j에 대하여 i<j 이면 h(j)가 h(i)의 배수가 되지 않도록 한다
- 항상 h1=1이 되도록 한다.
- 첫째 단계에서 전체배열을 h(k) 개의 부분배열로 나누어 각 부분배열에 삽입 정렬을 적용
- 두 번째 단게에서 전체배열을 h(k-1) 개의 부분배열로 나누어 각 부분배열에 삽입 정렬 적용
- 이 과정을 계속하다가 마지막 단계에서는 h1개의 부분배열에서 삽입정렬을 적용시켜 정렬을 끝냄
void ShellSort(vector<int> &array)
{
int h, i, j, value;
int n = array.size();
h = 1;
//부분배열 개수 결정
do h = 3 * h + 1; while (h < n);
do {
h /= 3;
//삽입정렬
for (i = h; i < n; i++)
{
value = array[i];
j = i;
while (array[j - h] > value) {
array[j] = array[j - h];
j -= h;
if (j <= h - 1) break;
}
array[j] = value;
}
} while (h > 1);
}
'알고리즘스터디' 카테고리의 다른 글
[알고리즘] 계수 정렬 (Count Sort) (0) | 2020.08.19 |
---|---|
[알고리즘] 힙 정렬 (Heap Sort) (0) | 2020.08.19 |
[알고리즘] 퀵 정렬 (Quick Sort) (0) | 2020.08.10 |
[알고리즘] 삽입정렬 (Insertion Sort) (0) | 2020.08.03 |
[알고리즘] 버블정렬 (Bubble Sort) (0) | 2020.08.03 |