SlideShare a Scribd company logo
Shell Sort Algorithm
셸 정렬 알고리즘
셸 정렬 알고리즘이란
일정한 구간을 쪼개고 해당 구간 안에서 데이터를 정렬하고
구간을 점점 작게 쪼개 나가면서 정렬하는 알고리즘이다.
셸 정렬 알고리즘이란
일정한 구간을 쪼개고 해당 구간 안에서 데이터를 정렬하고
구간을 점점 작게 쪼개 나가면서 정렬하는 알고리즘이다.
100 68 25 1 15 72
Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42]
구간 = 40
4 26 88
Buf[97] Buf[98] Buf[99]
셸 정렬 알고리즘이란
일정한 구간을 쪼개고 해당 구간 안에서 데이터를 정렬하고
구간을 점점 작게 쪼개 나가면서 정렬하는 알고리즘이다.
1 15 72 7 61 55
Buf[0] Buf[1] Buf[2] Buf[20] Buf[21] Buf[22]
구간 = 20
4 26 88
Buf[97] Buf[98] Buf[99]
셸 정렬 알고리즘의 시간복잡도는 O(𝑁(𝐿𝑜𝑔𝑁)2
) 이다.
그룹 단위로 나누어 정렬하기 때문에
데이터의 비교 횟수와 이동 횟수가 현저하게 줄어들고
이 점이 속도를 빠르게 만드는 이유가 된다.
다른 알고리즘(선택,삽입,버블정렬)과 비교했을때
데이터가 정렬된 형태에 따른 성능 차이는 거의 없다.
주요 함수
void ShellSort(void)
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
정렬할 배열 Buf의 값을
셸 정렬한다.
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
h는 구간이다.
h가 121일 때
반복문이 종료된다.
h
121
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
구간(h)을 3씩 나누어 쪼갠다.
첫번째 구간은 40부터 시작된다.
h
40
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
i는 40부터 Buf의 마지막 인덱스
값까지 반복한다.
100 68 25 1 15 72
Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42]
h
4 26 88
Buf[97] Buf[98]
40
i
40
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
비교할 값인 Buf[i]를 임시로
저장해 놓을 변수 v를 선언하고
while문에 사용될 변수 j를 i값으
로 대입한다.
100 68 25 1 15 72
Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42]
h
4 26 88
Buf[97] Buf[98]
40
i
40
v
1
j
40
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
j가 h이상이고
Buf[j-h]가 v(Buf[i]의값)보다 크면
(앞쪽 데이터가 더 크면)
반복문을 실행
100 68 25 1 15 72
Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42]
h
4 26 88
Buf[97] Buf[98]
40
i
40
v
1
j
40
Buf[j-h]
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
반복문이 참이면
(앞쪽 데이터가 더 크면)
Buf[j]에 Buf[j-h]를 대입하고
J에 j-h를 대입
100 68 25 100 15 72
Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42]
h
4 26 88
Buf[97] Buf[98]
40
i
40
v
1
j
0
Buf[j]
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
마지막으로 v의 값을 Buf[j]에
대입하여 데이터를 교환
1 68 25 100 15 72
Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42]
h
4 26 88
Buf[97] Buf[98]
40
i
40
v
1
j
0
Buf[j]
void ShellSort(void)
void ShellSort(void)
{
int i, j, h, v;
for(h=0;h<MAX;h = 3 * h + 1);
for(;h>0;h /= 3){
for(i=h;i<MAX;i++){
v = Buf[i];
j=i;
while(j>=h && Buf[j-h]>v){
Buf[j] = Buf[j-h];
j -= h;
}
Buf[j] = v;
}
}
}
그다음 구간은 40에서 3을 나눈
13이 되고 구간이 0보다 클때까지
계속 반복한다.
h
13
- 끝 -

More Related Content

PPTX
Insert Sort Algorithm (삽입 정렬 알고리즘)
PPT
Data Structure 3
PPTX
Network flow
PDF
skku cp2 w4
PPTX
Bubble Sort Algorithm (버블 정렬 알고리즘)
PDF
DP Optimization
PPT
&#53685;&#44228;&#54617;&#44060;&#47200;
PPTX
Selection Sort Algorithm(선택 정렬 알고리즘)
Insert Sort Algorithm (삽입 정렬 알고리즘)
Data Structure 3
Network flow
skku cp2 w4
Bubble Sort Algorithm (버블 정렬 알고리즘)
DP Optimization
&#53685;&#44228;&#54617;&#44060;&#47200;
Selection Sort Algorithm(선택 정렬 알고리즘)

Similar to Shell Sort Algorithm (셸 정렬 알고리즘) (20)

PDF
알고리즘 스터디(정렬) Seungdols
PDF
[Algorithm] Shell Sort
PPTX
[데브루키]노대영_알고리즘 스터디
PPTX
Quick Sort Algorithm (퀵 정렬 알고리즘)
PPTX
sort algorithim
PDF
Shell, merge, heap sort
PPTX
2.insertion sort
PPTX
정렬 알고리즘의 성능 분석
PPTX
[알고리즘 스터디 1주차]삽입정렬/버블정렬/선택정렬
PDF
퀵 정렬 알고리즘 기초
PPTX
알고리즘
PPTX
컴퓨터개론09
PPTX
Quick sort
PDF
알고리즘
PDF
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
PDF
Algorithms summary korean
PDF
자료구조5보고서
PPTX
Data and Sorting Algoritm
PDF
Project#5 최단거리 찾기 D0 Hwp
PPTX
amugona study 2nd
알고리즘 스터디(정렬) Seungdols
[Algorithm] Shell Sort
[데브루키]노대영_알고리즘 스터디
Quick Sort Algorithm (퀵 정렬 알고리즘)
sort algorithim
Shell, merge, heap sort
2.insertion sort
정렬 알고리즘의 성능 분석
[알고리즘 스터디 1주차]삽입정렬/버블정렬/선택정렬
퀵 정렬 알고리즘 기초
알고리즘
컴퓨터개론09
Quick sort
알고리즘
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
Algorithms summary korean
자료구조5보고서
Data and Sorting Algoritm
Project#5 최단거리 찾기 D0 Hwp
amugona study 2nd
Ad

Shell Sort Algorithm (셸 정렬 알고리즘)

  • 1. Shell Sort Algorithm 셸 정렬 알고리즘
  • 2. 셸 정렬 알고리즘이란 일정한 구간을 쪼개고 해당 구간 안에서 데이터를 정렬하고 구간을 점점 작게 쪼개 나가면서 정렬하는 알고리즘이다.
  • 3. 셸 정렬 알고리즘이란 일정한 구간을 쪼개고 해당 구간 안에서 데이터를 정렬하고 구간을 점점 작게 쪼개 나가면서 정렬하는 알고리즘이다. 100 68 25 1 15 72 Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42] 구간 = 40 4 26 88 Buf[97] Buf[98] Buf[99]
  • 4. 셸 정렬 알고리즘이란 일정한 구간을 쪼개고 해당 구간 안에서 데이터를 정렬하고 구간을 점점 작게 쪼개 나가면서 정렬하는 알고리즘이다. 1 15 72 7 61 55 Buf[0] Buf[1] Buf[2] Buf[20] Buf[21] Buf[22] 구간 = 20 4 26 88 Buf[97] Buf[98] Buf[99]
  • 5. 셸 정렬 알고리즘의 시간복잡도는 O(𝑁(𝐿𝑜𝑔𝑁)2 ) 이다. 그룹 단위로 나누어 정렬하기 때문에 데이터의 비교 횟수와 이동 횟수가 현저하게 줄어들고 이 점이 속도를 빠르게 만드는 이유가 된다. 다른 알고리즘(선택,삽입,버블정렬)과 비교했을때 데이터가 정렬된 형태에 따른 성능 차이는 거의 없다.
  • 7. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } 정렬할 배열 Buf의 값을 셸 정렬한다.
  • 8. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } h는 구간이다. h가 121일 때 반복문이 종료된다. h 121
  • 9. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } 구간(h)을 3씩 나누어 쪼갠다. 첫번째 구간은 40부터 시작된다. h 40
  • 10. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } i는 40부터 Buf의 마지막 인덱스 값까지 반복한다. 100 68 25 1 15 72 Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42] h 4 26 88 Buf[97] Buf[98] 40 i 40
  • 11. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } 비교할 값인 Buf[i]를 임시로 저장해 놓을 변수 v를 선언하고 while문에 사용될 변수 j를 i값으 로 대입한다. 100 68 25 1 15 72 Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42] h 4 26 88 Buf[97] Buf[98] 40 i 40 v 1 j 40
  • 12. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } j가 h이상이고 Buf[j-h]가 v(Buf[i]의값)보다 크면 (앞쪽 데이터가 더 크면) 반복문을 실행 100 68 25 1 15 72 Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42] h 4 26 88 Buf[97] Buf[98] 40 i 40 v 1 j 40 Buf[j-h]
  • 13. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } 반복문이 참이면 (앞쪽 데이터가 더 크면) Buf[j]에 Buf[j-h]를 대입하고 J에 j-h를 대입 100 68 25 100 15 72 Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42] h 4 26 88 Buf[97] Buf[98] 40 i 40 v 1 j 0 Buf[j]
  • 14. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } 마지막으로 v의 값을 Buf[j]에 대입하여 데이터를 교환 1 68 25 100 15 72 Buf[0] Buf[1] Buf[2] Buf[40] Buf[41] Buf[42] h 4 26 88 Buf[97] Buf[98] 40 i 40 v 1 j 0 Buf[j]
  • 15. void ShellSort(void) void ShellSort(void) { int i, j, h, v; for(h=0;h<MAX;h = 3 * h + 1); for(;h>0;h /= 3){ for(i=h;i<MAX;i++){ v = Buf[i]; j=i; while(j>=h && Buf[j-h]>v){ Buf[j] = Buf[j-h]; j -= h; } Buf[j] = v; } } } 그다음 구간은 40에서 3을 나눈 13이 되고 구간이 0보다 클때까지 계속 반복한다. h 13