Bubble Sort
Selection Sort
Insertion Sort
Merge Sort
Shell Sort
Quick Sort
Sorting Procedures
Pass - 1
5
4
2
6
7
1
3
1
4
5
2
6
7
1
3
2
4
2
5
6
7
1
3
3
4
2
5
6
7
1
3
4
4
2
5
6
7
1
3
5
4
2
5
6
1
3
7
4
2
5
6
1
7
3
6
void Sort() {for (i=0; i<(n-1); i++) { for (j=0; j<(n-i-1); j++) { if ( a[j] > a[j+1] ) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }
5
4
2
6
7
1
3
Original List
0
1
2
3
4
5
6
Pass - 2
4
2
5
6
1
3
7
1
2
4
5
6
1
3
7
2
2
4
5
6
1
3
7
3
2
4
5
6
1
3
7
4
2
4
5
1
6
3
7
5
2
4
5
1
3
6
7
void Sort() {for (i=0; i<(n-1); i++) { for (j=0; j<(n-i-1); j++) { if ( a[j] > a[j+1] ) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }
4
2
5
6
1
3
7
Original List
0
1
2
3
4
5
6
Pass - 3
2
4
5
1
3
6
7
1
2
4
5
1
3
6
7
2
2
4
5
1
3
6
7
3
2
4
1
5
3
6
7
4
2
4
1
3
5
6
7
void Sort() {for (i=0; i<(n-1); i++) { for (j=0; j<(n-i-1); j++) { if ( a[j] > a[j+1] ) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }
2
4
5
1
3
6
7
Original List
0
1
2
3
4
5
6
Pass - 4
2
4
1
3
5
6
7
1
2
4
1
3
5
6
7
2
2
1
4
3
5
6
7
3
2
1
3
4
5
6
7
void Sort() {for (i=0; i<(n-1); i++) { for (j=0; j<(n-i-1); j++) { if ( a[j] > a[j+1] ) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }
2
4
1
3
5
6
7
Original List
0
1
2
3
4
5
6
Pass - 5
2
1
3
4
5
6
7
1
1
2
3
4
5
6
7
2
1
2
3
4
5
6
7
void Sort() {for (i=0; i<(n-1); i++) { for (j=0; j<(n-i-1); j++) { if ( a[j] > a[j+1] ) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }
2
1
3
4
5
6
7
Original List
0
1
2
3
4
5
6
Pass - 6
1
2
3
4
5
6
7
1
1
2
3
4
5
6
7
void Sort() {for (i=0; i<(n-1); i++) { for (j=0; j<(n-i-1); j++) { if ( a[j] > a[j+1] ) { t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }
1
2
3
4
5
6
7
Original List
0
1
2
3
4
5
6
Pass - 1
5
4
2
6
7
1
3
1
5
4
2
6
7
1
3
2
5
4
2
6
7
1
3
3
5
4
2
6
7
1
3
4
5
4
2
6
7
1
3
5
5
4
2
6
7
1
3
6
5
4
2
6
7
1
3
1
4
2
6
7
5
3
void Sort() { int m;for (i=0; i<(n-1); i++) { m = i; for (j=i+1; j<n; j++) { if ( a[m] > a[j] ) m = j; } t = a[m]; a[m] = a[i]; a[i] = t; } }
5
4
2
6
7
1
3
Original List
0
1
2
3
4
5
6
Pass - 2
1
4
2
6
7
5
3
1
1
4
2
6
7
5
3
2
1
4
2
6
7
5
3
3
1
4
2
6
7
5
3
4
1
4
2
6
7
5
3
5
1
4
2
6
7
5
3
1
2
4
6
7
5
3
void Sort() { int m;for (i=0; i<(n-1); i++) { m = i; for (j=i+1; j<n; j++) { if ( a[m] > a[j] ) m = j; } t = a[m]; a[m] = a[i]; a[i] = t; } }
1
4
2
6
7
5
3
Original List
0
1
2
3
4
5
6
Pass - 3
1
2
4
6
7
5
3
1
1
2
4
6
7
5
3
2
1
2
4
6
7
5
3
3
1
2
4
6
7
5
3
4
1
2
4
6
7
5
3
1
2
3
6
7
5
4
void Sort() { int m;for (i=0; i<(n-1); i++) { m = i; for (j=i+1; j<n; j++) { if ( a[m] > a[j] ) m = j; } t = a[m]; a[m] = a[i]; a[i] = t; } }
1
2
4
6
7
5
3
Original List
0
1
2
3
4
5
6
Pass - 4
1
2
3
6
7
5
4
1
1
2
3
6
7
5
4
2
1
2
3
6
7
5
4
3
1
2
3
6
7
5
4
1
2
3
4
7
5
6
void Sort() { int m;for (i=0; i<(n-1); i++) { m = i; for (j=i+1; j<n; j++) { if ( a[m] > a[j] ) m = j; } t = a[m]; a[m] = a[i]; a[i] = t; } }
1
2
3
6
7
5
4
Original List
0
1
2
3
4
5
6
Pass - 5
1
2
3
4
7
5
6
1
1
2
3
4
7
5
6
2
1
2
3
4
7
5
6
1
2
3
4
5
7
6
void Sort() { int m;for (i=0; i<(n-1); i++) { m = i; for (j=i+1; j<n; j++) { if ( a[m] > a[j] ) m = j; } t = a[m]; a[m] = a[i]; a[i] = t; } }
1
2
3
4
7
5
6
Original List
0
1
2
3
4
5
6
Pass - 6
1
2
3
4
5
7
6
1
1
2
3
4
5
7
6
1
2
3
4
5
6
7
void Sort() { int m;for (i=0; i<(n-1); i++) { m = i; for (j=i+1; j<n; j++) { if ( a[m] > a[j] ) m = j; } t = a[m]; a[m] = a[i]; a[i] = t; } }
1
2
3
4
5
7
6
Original List
0
1
2
3
4
5
6
Pass - 1
5
4
2
6
7
1
3
1
5
5
2
6
7
1
3
Temp
4
4
5
2
6
7
1
3
void Sort() {for (i=1; i<n; i++) {
t = a[i] ; j = i - 1;
while( j >= 0 && a[j] > t ) { a[j+1] = a[j]; j--; } a[j+1] = t; } }
5
4
2
6
7
1
3
Original List
0
1
2
3
4
5
6
Pass - 2
4
5
2
6
7
1
3
1
4
4
5
6
7
1
3
Temp
2
2
4
5
6
7
1
3
4
5
5
6
7
1
3
2
void Sort() {for (i=1; i<n; i++) {
t = a[i] ; j = i - 1;
while( j >= 0 && a[j] > t ) { a[j+1] = a[j]; j--; } a[j+1] = t; } }
4
5
2
6
7
1
3
Original List
0
1
2
3
4
5
6
Pass - 3
2
4
5
6
7
1
3
1
2
4
5
6
7
1
3
Temp
6
2
4
5
6
7
1
3
void Sort() {for (i=1; i<n; i++) {
t = a[i] ; j = i - 1;
while( j >= 0 && a[j] > t ) { a[j+1] = a[j]; j--; } a[j+1] = t; } }
2
4
5
6
7
1
3
Original List
0
1
2
3
4
5
6
Pass - 4
2
4
5
6
7
1
3
1
2
4
5
6
7
1
3
Temp
7
2
4
5
6
7
1
3
void Sort() {for (i=1; i<n; i++) {
t = a[i] ; j = i - 1;
while( j >= 0 && a[j] > t ) { a[j+1] = a[j]; j--; } a[j+1] = t; } }
2
4
5
6
7
1
3
Original List
0
1
2
3
4
5
6
Pass - 5
2
4
5
6
7
1
3
1
2
2
4
5
6
7
3
Temp
1
1
2
4
5
6
7
3
2
4
5
6
7
7
3
2
2
4
5
6
6
7
3
3
2
4
5
5
6
7
3
4
2
4
4
5
6
7
3
5
void Sort() {for (i=1; i<n; i++) {
t = a[i] ; j = i - 1;
while( j >= 0 && a[j] > t ) { a[j+1] = a[j]; j--; } a[j+1] = t; } }
2
4
5
6
7
1
3
Original List
0
1
2
3
4
5
6
Pass - 6
1
2
4
5
6
7
3
1
1
2
4
4
5
6
7
Temp
3
1
2
3
4
5
6
7
1
2
4
5
6
7
7
2
1
2
4
5
6
6
7
3
1
2
4
5
5
6
7
4
1
2
4
4
5
6
7
5
void Sort() {for (i=1; i<n; i++) {
t = a[i] ; j = i - 1;
while( j >= 0 && a[j] > t ) { a[j+1] = a[j]; j--; } a[j+1] = t; } }
1
2
4
5
6
7
3
Original List
0
1
2
3
4
5
6
• Divide and Conquer
• Merge Sort
Divide and Conquer
1.
Base Case
, solve the problem
directly
if it is small enough
2.
Divide
the problem into two or more
similar and smaller
subproblems
3.
Recursively
solve the subproblems
Divide and Conquer - Sort
Problem:
• Input: A[left..right] –
unsorted
array of integers
Divide and Conquer - Sort
1.
Base case
at most one element (left ≥ right), return
2. Divide
A
into two
subarrays: FirstPart, SecondPart
Two Subproblems:
sort the FirstPart
sort the SecondPart
3.
Recursively
sort FirstPart
sort SecondPart
Overview
• Divide and Conquer
Merge Sort: Idea
Merge
Recursively
sort
Divide into
two halves
FirstPart
SecondPart
FirstPart
SecondPart
A
Merge Sort: Algorithm
Merge-Sort (A, left, right)
if
left ≥ right
return
else
middle ← b(left+right)/2⎦
Merge-Sort
(A, left, middle)
Merge-Sort
(A, middle+1, right)
Merge(A, left, middle, right)
Merge-Sort: Merge
A[middle]
A[left]
Sorted
FirstPart
Sorted
SecondPart
A[right]
merge
A:
A:
Sorted
Merge-Sort: Merge Example
6
10 14 22
3
5
15 28
L:
R:
Temporary Arrays
5
15 28 30
6
10 14
5
2
3
7
8
1
4
5
6
A:
Merge-Sort: Merge Example
3
5
15 28 30
6
10 14
L:
A:
3
15 28 30
6
10 14 22
R:
i=0
j=0
k=0
2
3
7
8
1
4
5
6
1
Merge-Sort: Merge Example
1
5
15 28 30
6
10 14
L:
A:
3
5
15 28
6
10 14 22
R:
k=1
2
3
7
8
1
4
5
6
2
i=0
j=1
Merge-Sort: Merge Example
1
2
15 28 30
6
10 14
L:
A:
6
10 14 22
R:
i=1
k=2
2
3
7
8
1
4
5
6
3
j=1
Merge-Sort: Merge Example
1
2
3
6
10 14
L:
A:
6
10 14 22
R:
i=2
j=1
k=3
2
3
7
8
1
4
5
6
4
Merge-Sort: Merge Example
1
2
3
4
6
10 14
L:
A:
6
10 14 22
R:
j=2
k=4
2
3
7
8
1
4
5
6
i=2
5
Merge-Sort: Merge Example
1
2
3
4
5
6
10 14
L:
A:
6
10 14 22
R:
i=2
j=3
k=5
2
3
7
8
1
4
5
6
6
Merge-Sort: Merge Example
1
2
3
4
5
6
14
L:
A:
6
10 14 22
R:
k=6
2
3
7
8
1
4
5
6
7
i=2
j=4
Merge-Sort: Merge Example
1
2
3
4
5
6
7
14
L:
A:
3
5
15 28
6
10 14 22
R:
2
3
7
8
1
4
5
6
8
i=3
j=4
k=7
Merge-Sort: Merge Example
1
2
3
4
5
6
7
8
L:
A:
3
5
15 28
6
10 14 22
R:
2
3
7
8
1
4
5
6
i=4
j=4
k=8
Merge(A, left, middle, right)
1.
n
1← middle – left + 1
2.
n
2← right – middle
3.
create array L[n
1], R[n
2]
4.
for i ← 0 to n
1
-1 do L[i] ← A[left +i]
5.
for j ← 0 to n
2-1 do R[j] ← A[middle+j]
6.
k ← i ← j ← 0
7.
while i < n
1&
j < n
28.
if
L[i] < R[j]
9.
A[k++] ← L[i++]
10.
else
11.
A[k++] ← R[j++]
12.
while i < n
113.
A[k++] ← L[i++]
14.
while j < n
215.
A[k++] ← R[j++]
n = n
1+n
2Space: n
Merge-Sort(A, 0, 7)
6 2 8 4 3 7 5 1
6 2 8
4
3 7 5
1
Divide
A:
6 2 8
4
3 7 5
1
6 2
8
4
Merge-Sort(A, 0, 3) , divide
A:
Merge-Sort(A, 0, 7)
3 7 5
1
8
4
6 2
6
2
Merge-Sort(A, 0, 1), divide
A:
Merge-Sort(A, 0, 7)
3 7 5
1
8
4
6
2
Merge-Sort(A, 0, 0) , base case
A:
3 7 5
1
8
4
6
2
Merge-Sort(A, 0, 0), return
A:
Merge-Sort(A, 0, 7)
3 7 5
1
8
4
6
2
Merge-Sort(A, 1, 1), base case
A:
3 7 5
1
8
4
6
2
Merge-Sort(A, 1, 1), return
A:
Merge-Sort(A, 0, 7)
3 7 5
1
8
4
2
6
Merge(A, 0, 0, 1)
A:
Merge-Sort(A, 0, 7)
3 7 5
1
8
4
2
6
Merge-Sort(A, 0, 1), return
A:
Merge-Sort(A, 0, 7)
3 7 5
1
8
4
2
6
Merge-Sort(A, 2, 3)
4
8
, divide
A:
Merge-Sort(A, 0, 7)
3 7 5
1
4
2
6
8
Merge-Sort(A, 2, 2), base case
A:
3 7 5
1
4
2
6
8
Merge-Sort(A, 2, 2),
return
A:
Merge-Sort(A, 0, 7)
4
2
6
8
Merge-Sort(A, 3, 3), base case
A:
3 7 5
1
4
2
6
8
Merge-Sort(A, 3, 3), return
A:
Merge-Sort(A, 0, 7)
3 7 5
1
2
6
4 8
Merge(A, 2, 2, 3)
A:
Merge-Sort(A, 0, 7)
3 7 5
1
2
6
4 8
Merge-Sort(A, 2, 3), return
A:
Merge-Sort(A, 0, 7)
3 7 5
1
2 4 6
8
Merge(A, 0, 1, 3)
A:
Merge-Sort(A, 0, 7)
3 7 5
1
2 4 6
8
Merge-Sort(A, 0, 3), return
A:
Merge-Sort(A, 0, 7)
3 7 5 1
2 4 6
8
Merge-Sort(A, 4, 7)
A:
Merge-Sort(A, 0, 7)
1 3 5 7
2 4 6
8
A:
Merge (A, 4, 5, 7)
Merge-Sort(A, 0, 7)
1 3 5 7
2 4 6
8
Merge-Sort(A, 4, 7), return
A:
Merge-Sort(A, 0, 7)
1 2 3 4 5 6 7 8
Merge(A, 0, 3, 7)
A:
Merge-Sort(A, 0, 7)
List Size - 1
5
4
4
5
4
5
2
6
1
7
3
6
2
2
6
4
5
7
1
1
7
2
6
4
5
5
4
6
2
7
1
3
Original List
1
2
3
4
5
6
7
List Size - 2
4
5
2
6
2
4
5
6
1
7
3
2
4
5
6
1
3
7
4
5
2
6
1
7
3
Original List
1
2
3
4
5
6
7
List Size - 4
2
4
5
6
1
3
7
1
2
3
4
5
6
7
2
4
5
6
1
3
7
Original List
1
2
3
4
5
6
7
List Gap - 3
5
4
2
6
7
1
3
1
5
4
2
6
7
1
3
2
5
4
2
6
7
1
3
3
5
4
1
3
7
2
6
void Sort() {int gap, flag; gap = n / 2; while( gap > 0 ) { do { flag = 0; for(i=1; i<=(n-gap); i++) if( a[i] > a[i+gap] ) { t = a[i]; a[i] = a[i+gap]; a[i+ga p] = t; flag = 1; } } while(flag); gap = gap / 2; } }
5
4
1
6
7
2
3
4
5
4
2
6
7
1
3
Original List
1
2
3
4
5
6
7
List Gap - 3
5
4
2
6
7
1
3
1
5
4
2
6
7
1
3
2
5
4
2
6
7
1
3
3
5
4
1
3
7
2
6
void Sort() {int gap, flag; gap = n / 2; while( gap > 0 ) { do { flag = 0; for(i=1; i<=(n-gap); i++) if( a[i] > a[i+gap] ) { t = a[i]; a[i] = a[i+gap]; a[i+ga p] = t; flag = 1; } } while(flag); gap = gap / 2; } }
5
4
1
6
7
2
3
4
5
4
1
3
7
2
6
Original List
1
2
3
4
5
6
7
List Gap - 1
5
4
1
3
7
2
6
1
4
5
1
3
7
2
6
2
4
1
5
3
7
2
6
3
4
1
3
5
2
6
7
4
1
3
5
7
2
6
4
4
1
3
5
7
2
3
5
4
1
3
5
2
7
6
6
…contd.
void Sort() {int gap, flag; gap = n / 2; while( gap > 0 ) { do { flag = 0; for(i=1; i<=(n-gap); i++) if( a[i] > a[i+gap] ) { t = a[i]; a[i] = a[i+gap]; a[i+ga p] = t; flag = 1; } } while(flag); gap = gap / 2; } }
5
4
1
3
7
2
6
Original List
1
2
3
4
5
6
7
…contd.
…contd. from previous
void Sort() {
int gap, flag; gap = n / 2; while( gap > 0 ) { do { flag = 0; for(i=1; i<=(n-gap); i++) if( a[i] > a[i+gap] ) { t = a[i]; a[i] = a[i+gap]; a[i+ga p] = t; flag = 1; } } while(flag); gap = gap / 2; } }
List Gap - 1
4
1
3
5
2
6
7
1
1
4
3
5
2
6
7
2
1
3
4
5
2
6
7
3
1
3
4
2
5
6
7
1
3
4
5
2
6
7
4
1
3
4
2
5
6
7
5
1
3
4
2
5
6
7
6
4
1
3
5
2
6
7
Original List
1
2
3
4
5
6
7
…contd.
…contd. from previous
void Sort() {
int gap, flag; gap = n / 2; while( gap > 0 ) { do { flag = 0; for(i=1; i<=(n-gap); i++) if( a[i] > a[i+gap] ) { t = a[i]; a[i] = a[i+gap]; a[i+ga p] = t; flag = 1; } } while(flag); gap = gap / 2; } }
List Gap - 1
1
3
4
2
5
6
7
1
1
3
4
2
5
6
7
2
1
3
4
2
5
6
7
3
1
3
2
4
5
6
7
1
3
2
4
5
6
7
4
1
3
2
4
5
6
7
5
1
3
2
4
5
6
7
6
1
3
4
2
5
6
7
Original List
1
2
3
4
5
6
7
…contd.
…contd. from previous
void Sort() {
int gap, flag; gap = n / 2; while( gap > 0 ) { do { flag = 0; for(i=1; i<=(n-gap); i++) if( a[i] > a[i+gap] ) { t = a[i]; a[i] = a[i+gap]; a[i+ga p] = t; flag = 1; } } while(flag); gap = gap / 2; } }
List Gap - 1
1
3
2
4
5
6
7
1
1
3
2
4
5
6
7
2
1
2
3
4
5
6
7
3
1
2
3
4
5
6
7
1
2
3
4
5
6
7
4
1
2
3
4
5
6
7
5
1
2
3
4
5
6
7
6
1
3
2
4
5
6
7
Original List
1
2
3
4
5
6
7
…contd.
…contd. from previous
void Sort() {
int gap, flag; gap = n / 2; while( gap > 0 ) { do { flag = 0; for(i=1; i<=(n-gap); i++) if( a[i] > a[i+gap] ) { t = a[i]; a[i] = a[i+gap]; a[i+ga p] = t; flag = 1; } } while(flag); gap = gap / 2; } }