Sorting Handout
Sorting Handout
04, 2014
Outline
Introduction
Properties
• Stability: data with equal key maintain their relative
input order in the output
• Eficiency: number of comparisons and number of
moves
Insertion Sort
9 9 8 6 6 6 6 6
12 12 9 8 8 8 8 8
8 8 12 9 9 9 9 9
6 6 6 12 12 12 12 12
22 22 22 22 22 15 15 15
15 15 15 15 15 22 22 22
30 30 30 30 30 30 30 25
25 25 25 25 25 25 25 30
Insertion Sorting Implementation
smallest
9 6 6 6 6 6 6 6
12 12 8 8 8 8 8 8
8 8 12 9 9 9 9 9
6 9 9 12 12 12 12 12
22 22 22 22 22 15 15 15
15 15 15 15 15 22 22 22
30 30 30 30 30 30 30 25
25 25 25 25 25 25 25 30
Selection Sorting Implementation
9 6 6 6
12 9 8 8
8 12 9 9
6 8 12 12
22 15 15 15
15 22 22 22
30 25 25 25
25 30 30 30
Shell Sort
0 1 2 3 4 5 6 7 8 9
k=3
1 1+k 1+2k
Segment 2
2 2+k 2+2k
Segment 3
Shell Sorting Algorithm
• In each iteration, sort K segments using insertion sort
• Reduce K after each iteration until K == 1
Step 0 k=5 Sorted Seg. Combine
24 24 6 6
12 12 5 5
14 14 2 2
7 7 1 1
22 22 9 9
6 6 8 8
5 5 12 12
16 16 14 14
34 34 7 7
9 9 22 22
8 8 24 24
62 62 62 62
2 2 16 16
1 1 34 34
1 for (k=first_incremental_value;
2 k>=1;
3 k=next_incremental_value)
4 for (segment=0;
5 segment<k;
6 segment++)
7 segmentSort(segment,k);
segmentSort(int segment,int k)
1 for (current=segment+k;
2 current<size;
3 current=current+k) {
4 tmp = data[current];
5 for (walker=current-k;
6 walker>=0
7 && tmp < data[walker];
8 walker=walker-k)
9 data[walker+k]=data[walker];
10 data[walker+k]=tmp;
11 }
Shell Sort Discussion
8 4
12 10 7 6
Heap Sort
8 7 2 4
12 10
Heap Sort
8 10 2 4 6
12
Example
12 6 10 7 8 4 7 2 6
10 10 6 6 6 6 6 6 2
8 8 8 8 7 7 4 4 4
2 2 2 2 2 2 2 7 7
4 4 4 4 4 8 8 8 8
7 7 7 10 10 10 10 10 10
6 12 12 12 12 12 12 12 12
Divide-And-Conquer Meta Algorithm
8 4 12 6 33 42 16 7
8 4 12 6 33 42 16 7
4 6 8 12 7 16 33 42
4 6 7 8 12 16 33 42
Quick Sort
8 4 12 6 33 42 16 7 5
4 6 7 5 8 12 33 42 16
4 5 6 7 8 12 16 33 42
4 5 6 7 8 12 16 33 42
Pivot Selection
1 i n t p a r t i t i o n ( i n t key [ ] , i n t l e f t , i n t r i g h t , i n t p i v o t ) {
2 do {
3 while ( key [++ l e f t ] < p i v o t ) ;
4 while ( ( l e f t < r i g h t ) && key[−− r i g h t ] >= p i v o t ) ;
5 myswap ( key , l e f t , r i g h t ) ;
6 } while ( l e f t < r i g h t ) ;
7 return l e f t ;
8 }
Partition
1 i n t p a r t i t i o n ( i n t key [ ] , i n t l e f t , i n t r i g h t , i n t p i v o t ) {
2 do {
3 while ( key [++ l e f t ] < p i v o t ) ;
4 while ( ( l e f t < r i g h t ) && key[−− r i g h t ] >= p i v o t ) ;
5 myswap ( key , l e f t , r i g h t ) ;
6 } while ( l e f t < r i g h t ) ;
7 return l e f t ;
8 }
Partition
1 i n t p a r t i t i o n ( i n t key [ ] , i n t l e f t , i n t r i g h t , i n t p i v o t ) {
2 do {
3 while ( key [++ l e f t ] < p i v o t ) ;
4 while ( ( l e f t < r i g h t ) && key[−− r i g h t ] >= p i v o t ) ;
5 myswap ( key , l e f t , r i g h t ) ;
6 } while ( l e f t < r i g h t ) ;
7 return l e f t ;
8 }
left right
Partition
1 i n t p a r t i t i o n ( i n t key [ ] , i n t l e f t , i n t r i g h t , i n t p i v o t ) {
2 do {
3 while ( key [++ l e f t ] < p i v o t ) ;
4 while ( ( l e f t < r i g h t ) && key[−− r i g h t ] >= p i v o t ) ;
5 myswap ( key , l e f t , r i g h t ) ;
6 } while ( l e f t < r i g h t ) ;
7 return l e f t ;
8 }
left right
Partition
1 i n t p a r t i t i o n ( i n t key [ ] , i n t l e f t , i n t r i g h t , i n t p i v o t ) {
2 do {
3 while ( key [++ l e f t ] < p i v o t ) ;
4 while ( ( l e f t < r i g h t ) && key[−− r i g h t ] >= p i v o t ) ;
5 myswap ( key , l e f t , r i g h t ) ;
6 } while ( l e f t < r i g h t ) ;
7 return l e f t ;
8 }
left right
Partition
1 i n t p a r t i t i o n ( i n t key [ ] , i n t l e f t , i n t r i g h t , i n t p i v o t ) {
2 do {
3 while ( key [++ l e f t ] < p i v o t ) ;
4 while ( ( l e f t < r i g h t ) && key[−− r i g h t ] >= p i v o t ) ;
5 myswap ( key , l e f t , r i g h t ) ;
6 } while ( l e f t < r i g h t ) ;
7 return l e f t ;
8 }
left right
Partition
1 i n t p a r t i t i o n ( i n t key [ ] , i n t l e f t , i n t r i g h t , i n t p i v o t ) {
2 do {
3 while ( key [++ l e f t ] < p i v o t ) ;
4 while ( ( l e f t < r i g h t ) && key[−− r i g h t ] >= p i v o t ) ;
5 myswap ( key , l e f t , r i g h t ) ;
6 } while ( l e f t < r i g h t ) ;
7 return l e f t ;
8 }
left right
Radix-Exchange Sort
7 4 1 6 3 2 5 0
1 11
111 100
1 00 011
0 11 110
1 10 011
0 11 010
0 10 101
1 01 000
0 00
0 1 2 3 4 5 6 7
Example
Similarities
• partition array
• sort subarray recursively
Differences
• Partitioning Method
• RE partitions array based on the bit at corresponding
position
• Q partitions array based on the pivot value
• Time complexity
• RE: O(bn)
• Q: O(nlog2 n)
Empirical Comparison