셸 정렬
위키백과 ― 우리 모두의 백과사전.
셸 정렬(Shell sort)은 가장 오래된 정렬 알고리즘의 하나이다. 이름은 1959년 이 방법을 발표한 창안자 도널드 셸의 이름을 따서 붙여졌다. 셸 정렬은 개념을 이해하고 구현하기는 쉬우나 시간복잡도 분석은 조금 복잡하다.
셸 정렬은 다음과 같은 삽입 정렬의 성질을 이용, 보완한 삽입정렬의 일반화로 볼 수 있다.
- 삽입 정렬은 입력되는 초기리스트가 "거의 정렬"되어 있을 경우 효율적이다.
- 삽입 정렬은 한 번에 한 요소의 위치만 결정되기 때문에 비효율적이다.
셸 정렬은 주어진 자료 리스트를 특정 매개변수 값의 길이를 갖는 부파일(subfile)로 쪼개서, 각 부파일에서 정렬을 수행한다. 즉, 매개변수 값에 따라 부파일(Subfile)이 발생하며, 매개변수값을 줄이며 이 과정을 반복하고 결국 매개변수 값이 1이면 정렬은 완성된다.
목차 |
[편집] 알고리듬의 개요
- 자료리스트를 2차원배열로 나열한다.
- 각 배열의 열들을 정렬한다.
[편집] 예제
[2 5 3 4 3 9 3 2 5 4 1 3]로 리스트가 주어졌을 때 이 리스트를 셸 정렬로 정렬해 보자.
- 4열로 구성된 행렬로 나열하여 열단위로 정렬한다.
2 5 3 4 ⇒ 2 4 1 2 3 9 3 2 3 5 3 3 5 4 1 3 5 9 3 4 - 정렬된 4열 행렬을 2열 행렬로 나열하여 마찬가지로 열단위로 정렬한다.
2 1 ⇒ 2 1 3 3 3 2 5 3 4 3 4 2 5 3 5 3 5 3 9 4 9 4 - 정렬된 2열 행렬을 한 열단위로 나열해서 삽입 정렬한다.
2 3 4 5 5 9 1 2 3 3 3 4 ⇒ 1 2 2 3 3 3 3 4 4 5 5 9 이 때, 자료가 멀리 이동될 필요가 없다는 장점이 있다.
[편집] 소스 코드
[편집] 자바(Java)
public static void shellSort(Comparable[] array) { //각 단계의 시작값 int[] cols = {1,5,12,23,62,145,367,815,1968,4711,11969,27901,84801, 213331,543749,1355339,3501671,8810089,21521774, 58548857,157840433,410151271,1131376761,2147483647}; int c; for (c = 0; cols[c] < array.length / 4; c++) ; // 매개변수 값에 대한 순환 for (; c >= 0; c--) { int step = cols[c]; for (int i = step; i < array.length; i++) { Comparable m = array[i]; int j; for (j=i; j>=step; j-=step) { if (isLastBigger(array[j-step],m)) break; array[j] = array[j-step]; } array[j] = m; } } }
| 이 글은 전산학에 관한 토막글입니다. 서로의 지식을 모아 알차게 문서를 완성해 갑시다. |
|
|
|
|---|---|
| 이론 | 계산 복잡도 이론 | 점근 표기법 | 완전순서 | 비교 정렬 |
| 교환 정렬 | 거품 정렬 | 칵테일 정렬 | 홀짝 정렬 | 콤 정렬 | 난쟁이 정렬 | 퀵 정렬 |
| 선택 정렬 | 선택 정렬 | 힙 정렬 |
| 삽입 정렬 | 삽입 정렬 | 셸 정렬 | 트리 정렬 | 라이브러리 정렬 |
| 합병 정렬 | 합병 정렬 | 스트랜드 정렬 |
| 비(非)비교 정렬 | 기수 정렬 | 버킷 정렬 | 계수 정렬 | 비둘기집 정렬 | 버스트 정렬 |

