셸 정렬은 gap(특정 간격)이 1이 될때까지 gap의 간격만큼 삽입 정렬이 이뤄진다.

gap을 키우면 아래와 같이 gap만큼 떨어진 원소들을 비교하며 삽입 정렬이 이뤄진다.
즉, 간격에 초점을 맞추기 보다는 삽입 정렬에 초점을 맞추되, 특정 간격만큼 떨어진 원소들끼리 비교한다고 생각하면 이해하는데 도움이 될 것이다.
public static void shellSort(int[] arr) {
int len = arr.length;
// gap이 1이 될때까지 크기를 절반씩 줄임
for(int gap = len / 2; gap > 0; gap /= 2) {
// gap만큼 떨어진 원소들 간에 삽입 정렬
for(int i = gap; i < len; i++) {
int j = i;
int key = arr[j];
for(j = i; j >= gap && key < arr[j - gap]; j -= gap) {
arr[j] = arr[j - gap];
}
arr[j] = key;
}
}
}