Title: Shell Sort
1Shell Sort
2Shell Sort
- Invented by Donald Shell in 1959, the shell sort
is the most efficient of the O(n²) class of
sorting algorithms. Of course, the shell sort is
also the most complex of the O(n²) algorithms.
It is an improved version of the insertion sort.
3Shell Sort
- Shell sort is a generalization of insertion
sort, with two observations in mind - Insertion sort is efficient if the input is
"almost sorted". - Insertion sort is inefficient, on average,
because it moves values just one position at a
time. - Shell sort improves insertion sort by comparing
elements separated by a gap of several positions.
This lets an element take "bigger steps" toward
its expected position. Multiple passes over the
data are taken with smaller and smaller gap
sizes. The last step of Shell sort is a plain
insertion sort, but by then, the array of data is
guaranteed to be almost sorted.
4Shell Sort the idea
- The idea of Shellsort is the following
- arrange the data sequence in a two-dimensional
array - sort the columns of the array
- The effect is that the data sequence is
partially sorted. The process above is repeated,
but each time with a narrower array, i.e. with a
smaller number of columns. In the last step, the
array consists of only one column. In each step,
the sorted-ness of the sequence is increased,
until in the last step it is completely sorted.
However, the number of sorting operations
necessary in each step is limited, due to the
pre-sortedness of the sequence obtained in the
preceding steps.
5Shell Sort the idea
- Example Let 3 7 9 0 5 1 6 8 4 2 0 6 1 5 7 3 4
9 8 2 be the data sequence to be sorted. First,
it is arranged in an array with 7 columns (left),
then the columns are sorted (right) - 3 7 9 0 5 1 6 3 3 2 0 5 1 5
- 8 4 2 0 6 1 5 7 4 4 0 6 1 6
- 7 3 4 9 8 2 8 7 9 9 8 2
- Data elements 8 and 9 have now already come to
the end of the sequence, but a small element (2)
is also still there. In the next step, the
sequence is arranged in 3 columns, which are
again sorted
6Shell Sort the idea
- 3 3 2 0 0 1
- 0 5 1 1 2 2
- 5 7 4 3 3 4
- 4 0 6 4 5 6
- 1 6 8 5 6 8
- 7 9 9 7 7 9
- 8 2 8 9
- Now the sequence is almost completely sorted.
When arranging it in one column in the last step,
it is only a 6, an 8 and a 9 that have to move a
little bit to their correct position.
7Shell Sort the implementation
Actually, the data sequence is not arranged in a
two-dimensional array, but held in a
one-dimensional array that is indexed
appropriately. For instance, data elements at
positions 0, 5, 10, 15 etc. would form the first
column of an array with 5 columns. The "columns"
obtained by indexing in this way are sorted with
Insertion Sort, since this method has a good
performance with presorted sequences.
8Sorting in Place Shell Sort
h 13
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
77 62 14 25 30 14 56 98 4 12 88 21 80 9 70 55
9Sorting in Place Shell Sort
h 13
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
77 62 14 25 30 14 56 98 4 12 88 21 80 9 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
10Sorting in Place Shell Sort
h 13
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
77 62 14 25 30 14 56 98 4 12 88 21 80 9 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
11Sorting in Place Shell Sort
h 13
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
77 62 14 25 30 14 56 98 4 12 88 21 80 9 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
12Sorting in Place Shell Sort
h 13
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
77 62 14 25 30 14 56 98 4 12 88 21 80 9 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
13Sorting in Place Shell Sort
h 13
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
77 62 14 25 30 14 56 98 4 12 88 21 80 9 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
14Sorting in Place Shell Sort
h 4
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
15Sorting in Place Shell Sort
h 4
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
9 62 14 25 30 14 56 98 4 12 88 21 80 77 70 55
9 14 14 25 30 62 56 98 4 12 88 21 80 77 70 55
9 14 14 25 30 62 56 98 4 12 88 21 80 77 70 55
9 14 14 25 30 62 56 98 4 12 88 21 80 77 70 55
4 14 14 25 9 62 56 98 30 12 88 21 80 77 70 55
4 12 14 25 9 14 56 98 30 62 88 21 80 77 70 55
4 12 14 25 9 14 56 98 30 62 88 21 80 77 70 55
4 12 14 21 9 14 56 25 30 62 88 98 80 77 70 55
4 12 14 21 9 14 56 25 30 62 88 98 80 77 70 55
4 12 14 21 9 14 56 25 30 62 88 98 80 77 70 55
4 12 14 21 9 14 56 25 30 62 70 98 80 77 88 55
4 12 14 21 9 14 56 25 30 62 70 55 80 77 88 98
16Sorting in Place Shell Sort
h 1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4 12 14 21 9 14 56 25 30 62 70 55 80 77 88 98
17Sorting in Place Shell Sort
h 1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4 12 14 21 9 14 56 25 30 62 70 55 80 77 88 98
4 12 14 21 9 14 56 25 30 62 70 55 80 77 88 98
4 12 14 21 9 14 56 25 30 62 70 55 80 77 88 98
4 12 14 21 9 14 56 25 30 62 70 55 80 77 88 98
4 9 12 14 21 14 56 25 30 62 70 55 80 77 88 98
4 9 12 14 14 21 56 25 30 62 70 55 80 77 88 98
4 9 12 14 14 21 56 25 30 62 70 55 80 77 88 98
4 9 12 14 14 21 25 56 30 62 70 55 80 77 88 98
4 9 12 14 14 21 25 30 56 62 70 55 80 77 88 98
4 9 12 14 14 21 25 30 56 62 70 55 80 77 88 98
4 9 12 14 14 21 25 30 56 62 70 55 80 77 88 98
4 9 12 14 14 21 25 30 55 56 62 70 80 77 88 98
4 9 12 14 14 21 25 30 55 56 62 70 80 77 88 98
4 9 12 14 14 21 25 30 55 56 62 70 77 80 88 98
4 9 12 14 14 21 25 30 55 56 62 70 77 80 88 98
18Advantage of Shell Sort
- Faster than the ordinary insertion sort
- More efficient exchange of elements that are far
from their proper position
Shell sort
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
77 62 14 25 30 14 56 98 4 12 88 21 80 9 70 55
1 element to be shifted
Insertion sort
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4 12 14 14 21 25 30 56 62 77 80 88 98 9 70 55
12 elements to be shifted
19Efficiency of Shell Sort
- Efficiency depends of the values of h
- Values of h recommended by Knuth in 1969
- 1 4 13 40 121 364 1093 3280 9841 ...
- Start with 1, then multiply by 3 and add 1
- Less than O(n3/2) comparisons
- Values of h recommended by Shell in 1959
- 1 2 4 8 16 32 64 128 256 512 1024 2048 ...
- Bad sequence because elements in odd positions
are not compared to elements in even positions
until the final pass - Worst case efficiency of O(n2) smallest values
in even positions and largest values in odd
positions
20Example Shell Sort
- void shell_sort(int A, int size)
-
- int i, j, incrmnt, temp incrmnt size / 2
- while (incrmnt gt 0)
- for (iincrmnt i lt size i)
- j i
- temp Ai
- while ((j gt incrmnt) (Aj-incrmnt gt
temp)) - Aj Aj - incrmnt
- j j - incrmnt
-
- Aj temp
- incrmnt / 2
-
-