Bubble Sort Selection Sort Insertion Sort Merge Sort Shell Sort Quick Sort
Sorting
Procedures
Bubble Sort
Pass -
1 1 5 4 2 6 7 1 3
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 1 4 2 5 6 1 3 7
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 1 2 4 5 1 3 6 7
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 1 2 4 1 3 5 6 7
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 1 2 1 3 4 5 6 7
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 1 2 3 4 5 6 7
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
Selection Sort
Pass -
1 1 5 4 2 6 7 1 3 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 1 4 2 6 7 5 3 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 1 2 4 6 7 5 3 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 1 2 3 6 7 5 4 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 1 2 3 4 7 5 6 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 1 2 3 4 5 7 6 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
Insertion Sort
Pass -
1 1 5 4 2 6 7 1 3 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 1 4 5 2 6 7 1 3
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 1 2 4 5 6 7 1 3 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 1 2 4 5 6 7 1 3 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 1 2 4 5 6 7 1 3
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 1 2 4 5 6 7 3
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
Merge Sort
• 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
4. Combine solutions to the subproblems
Divide and Conquer - Sort
Problem:
• Input: A[left..right] – unsorted array of integers
• Output: A[left..right] – sorted in non-decreasing order
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
4. Combine sorted FirstPart and sorted SecondPart
Overview
• Divide and Conquer
• Merge Sort
Merge Sort: Idea
Merge Recursively
sort
Divide into
two halves
FirstPart SecondPartFirstPart SecondPart
A
A is sorted!
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)
Recursive Call
Merge-Sort: Merge
A[middle]
A[middle]
A[left]
A[left]
Sorted Sorted FirstPart FirstPart
Sorted Sorted SecondPart SecondPart
A[right]
A[right]
merge merge A: A:
A: A:
Sorted
Sorted
Merge-Sort: Merge Example
6 10 14 22 3 5 15 28
L: L: R: R:
Temporary Arrays Temporary Arrays
5 15 28 30 6 10 14
2 5 3 7 8 1 4 5 6
A: A:
Merge-Sort: Merge Example
3 5 15 28 30 6 10 14
L: L:
A: A:
3 15 28 30 6 10 14 22
R: 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: L:
A: A:
3 5 15 28 6 10 14 22
R: 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: L:
A: A:
6 10 14 22
R: 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: L:
A: A:
6 10 14 22
R: 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: L:
A: A:
6 10 14 22
R: 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: L:
A: A:
6 10 14 22
R: 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: L:
A: A:
6 10 14 22
R: 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: L:
A: A:
3 5 15 28 6 10 14 22
R: 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: L:
A: A:
3 5 15 28 6 10 14 22
R: R:
2 3 7 8 1 4 5 6
i=4 j=4
k=8
Merge(A, left, middle, right)
1. n1 ← middle – left + 1 2. n2 ← right – middle
3. create array L[n1], R[n2]
4. for i ← 0 to n1-1 do L[i] ← A[left +i]
5. for j ← 0 to n2-1 do R[j] ← A[middle+j]
6. k ← i ← j ← 0
7. while i < n1 & j < n2
8. if L[i] < R[j]
9. A[k++] ← L[i++]
10. else
11. A[k++] ← R[j++]
12. while i < n1
13. A[k++] ← L[i++]
14. while j < n2
15. A[k++] ← R[j++] n = n1+n2 Space: n
Time : cn for some constant c
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:
Merge-Sort(A, 0, 7)
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:
Merge-Sort(A, 0, 7)
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:
Merge-Sort(A, 0, 7)
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:
Merge-Sort(A, 0, 7)
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)
Merge-Sort(A, 0, 7), done!
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
Shell Sort
List Gap -
3 1 5 4 2 6 7 1 3
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+gap] = 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 1 5 4 2 6 7 1 3
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+gap] = 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 1 5 4 1 3 7 2 6
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+gap] = 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+gap] = t;
flag = 1;
}
} while(flag);
gap = gap / 2;
} }
List Gap -
1 1 4 1 3 5 2 6 7
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+gap] = t;
flag = 1;
}
} while(flag);
gap = gap / 2;
} }
List Gap -
1 1 1 3 4 2 5 6 7
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+gap] = t;
flag = 1;
}
} while(flag);
gap = gap / 2;
} }
List Gap -
1 1 1 3 2 4 5 6 7
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+gap] = t;
flag = 1;
}
} while(flag);
gap = gap / 2;
} }