셸 정렬은 주어진 자료 리스트를 특정 매개변수 값의 길이를 갖는 부파일(subfile)로 쪼개서, 각 부파일에서 정렬을 수행한다. 즉, 매개변수 값에 따라 부파일(Subfile)이 발생하며, 매개변수값을 줄이며 이 과정을 반복하고 결국 매개변수 값이 1이면 정렬은 완성된다.
셸 정렬은 다음과 같은 과정으로 나눈다.
셸 정렬에서 데이터를 나누는 값(이하 N)은 보통 전체에서 2로 나누는 값으로 진행한다. 그러나 3을 나누고 1을 더하는 경우가 더 빠르다고 알려져 있다. 즉 N/2 보다는 N/3+1이 더 빠르다.
def Shellsort(arr):
h = 1
while h < len(arr):
h = 3*h + 1
h = h//3
while h > 0:
for i in range(h,len(arr)):
k=i-h
key=arr[i]
while k>=0 and key < arr[k]:
arr[k+h] = arr[k]
k=k-h
arr[k+h] = key
h = h//3
return arr
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;
}