L1 L3
L1 L3
Ø Data Structures
Ø Basic Mathematics
Ø C Programming or Principles of Programming
(Loops, Functions, Conditional statements, etc.)
Design and Analysis of Algorithms
• Algorithm: a set of finite steps to solve a
particular problem
• Design: an art to design the algorithms which
minimize the cost
• Analysis: predict the cost of an algorithm in
terms of resources and performance
• Aim of this course: The theoretical study of
design and analysis of computer algorithms.
WHAT IS GOOD OR BAD ALGORITHM ?
Our Machine Model
Generic Random Access Machine (RAM)
• Executes operations sequentially
• Set of primitive operations:
– Arithmetic. Logical, Comparisons, Function calls
Example:
Input: 8 2 4 9 3 6
Output: 2 3 4 6 8 9
Structure of data
Why Study Sorting Algorithms?
• There are a variety of situations that we can encounter
– Do we have randomly ordered keys?
– Are all keys distinct?
– How large is the set of keys to be ordered?
– Need guaranteed performance?
12
Insertion Sort
6 10 24 36
12
Insertion Sort
6 10 24 3
6
12
Example of insertion sort
8 2 4 9 3 6
Example of insertion sort
8 2 4 9 3 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
2 4 8 9 3 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
2 4 8 9 3 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
2 4 8 9 3 6
2 3 4 8 9 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
2 4 8 9 3 6
2 3 4 8 9 6
Example of insertion sort
8 2 4 9 3 6
2 8 4 9 3 6
2 4 8 9 3 6
2 4 8 9 3 6
2 3 4 8 9 6
2 3 4 6 8 9 done
Insertion Sort
input array
5 2 4 6 1 3
at each iteration, the array is divided in two sub-arrays:
left sub-array right sub-array
sorted unsorted
INSERTION-SORT
Alg.: INSERTION-SORT(A) 1 2 3 4 5 6 7 8
for j ← 2 to n a1 a2 a3 a4 a5 a6 a7 a8
do key ← A[ j ] key
Insert A[ j ] into the sorted sequence A[1 . . j -1]
i←j-1
while i > 0 and A[i] > key
do A[i + 1] ← A[i]
i←i–1
A[i + 1] ← key
• Insertion sort – sorts the elements in place
Loop Invariant for Insertion Sort
Alg.: INSERTION-SORT(A)
for j ← 2 to n
do key ← A[ j ]
Insert A[ j ] into the sorted sequence A[1 . . j -1]
i←j-1
while i > 0 and A[i] > key
do A[i + 1] ← A[i]
i←i–1
A[i + 1] ← key
Invariant: at the start of the for loop the elements in A[1 . . j-1] are in
sorted order
Proving Loop Invariants
• Proving loop invariants works like induction
• Initialization (base case):
– It is true prior to the first iteration of the loop
• Maintenance (inductive step):
– If it is true before an iteration of the loop, it remains true
before the next iteration
• Termination:
– When the loop terminates, the invariant gives us a useful
property that helps show that the algorithm is correct
– Stop the induction when the loop terminates
Loop Invariant for Insertion Sort
• Initialization:
– Just before the first iteration, j = 2:
the subarray A[1 . . j-1] = A[1], (the
element originally in A[1]) – is sorted
Loop Invariant for Insertion Sort
• Maintenance:
– the while inner loop moves A[j -1], A[j -2], A[j -3], and so
on, by one position to the right until the proper position for
key (which has the value that started out in A[j]) is found
– At that point, the value of key is placed into this position.
Loop Invariant for Insertion Sort
• Termination:
– The outer for loop ends when j = n + 1 Þ j-1 = n
– Replace n with j-1 in the loop invariant:
• the subarray A[1 . . n] consists of the elements originally in A[1 . . n],
but in sorted order
j-1 j
Invariant: at the start of the for loop the elements in A[1 . . j-1] are in
sorted order
Analysis of Insertion Sort
INSERTION-SORT(A) cost times
for j ← 2 to n c1 n
do key ← A[ j ] c2 n-1
Insert A[ j ] into the sorted sequence A[1 . . j -1] 0 n-1
i←j-1 c4 n-1
å
n
while i > 0 and A[i] > key c5 j =2 j
t
å
n
do A[i + 1] ← A[i] c6 j =2
(t j - 1)
å
n
i←i–1 c7 j =2
(t j - 1)
A[i + 1] ← key c8 n-1
tj: # of times the while statement is executed at iteration j
T (n) = c1n + c2 (n - 1) + c4 (n - 1) + c5 å t j + c6 å (t j - 1) + c7 å (t j - 1) + c8 (n - 1)
n n n
j =2 j =2 j =2
Best Case Analysis
• The array is already sorted “while i > 0 and A[i] > key”
– A[i] ≤ key upon the first time the while loop test is run
(when i = j -1)
– tj = 1
= an - b = Q(n)
T (n) = c1n + c2 (n - 1) + c4 (n - 1) + c5 å t j + c6 å (t j - 1) + c7 å (t j - 1) + c8 (n - 1)
n n n
j =2 j =2 j =2
Worst Case Analysis
• The array is in reverse sorted order“while i > 0 and A[i] > key”
– Always A[i] > key in while loop test
– Have to compare key with all elements to the left of the j-th
position Þ compare with j-1 elements Þ tj = j
n
n(n + 1) n
n(n + 1) n
n(n - 1)
using å
j =1
j=
2
=> å j =
j =2 2
- 1 => å ( j - 1) =
j =2 2
we have:
æ n( n + 1) ö n( n - 1) n( n - 1)
T ( n ) = c1n + c2 ( n - 1) + c4 ( n - 1) + c5 ç - 1÷ + c6 + c7 + c8 ( n - 1)
è 2 ø 2 2
= an 2 + bn + c a quadratic function of n
j =2 j =2 j =2
Comparisons and Exchanges in Insertion Sort
å
n
do A[i + 1] ← A[i] c6 j =2
(t j - 1)
exchanges c7 å
n
i←i–1 » n2/2 j =2
(t j - 1)
i
1 2 3 n
8 4 6 9 2 3 1
j
8 4 6 9 2 1 3 1 2 8 4 6 9 3
i=1 j i=3 j
8 4 6 9 1 2 3 1 2 3 8 4 6 9
i=1 j i=4 j
8 4 6 1 9 2 3 1 2 3 4 8 6 9
i=1 j i=5 j
8 4 1 6 9 2 3 1 2 3 4 6 8 9
i=1 j i=6 j
8 1 4 6 9 2 3 1 2 3 4 6 8 9
i=1 j i=7
j
1 8 4 6 9 2 3
i=1 j
Bubble Sort
Alg.: BUBBLESORT(A)
for i ¬ 1 to length[A]
do for j ¬ length[A] downto i + 1
do if A[j] < A[j -1]
then exchange A[j] « A[j-1]
i
8 4 6 9 2 3 1
i=1 j
Bubble-Sort Running Time
Alg.: BUBBLESORT(A)
for i ¬ 1 to length[A] c1
do for j ¬ length[A] downto i + 1 c2
do if A[j] < A[j -1] c3
then exchange A[j] « A[j-1] c4
Bubble-Sort Running Time
Alg.: BUBBLESORT(A)
for i ¬ 1 to length[A] c1
do for j ¬ length[A] downto i + 1 c2
Comparisons: » n2/2 do if A[j] < A[j -1] c3
Exchanges: » n2/2
then exchange A[j] « A[j-1] c4
n n n
T(n) = c1(n+1) + c2 å (n - i + 1) + c3 å (n - i ) + c4 å (n - i )
i =1
i =1 i =1
n
= Q(n) + (c2 + c2 + c4) å (n - i )
i =1
n n n
n ( n + 1) n 2
n
where å (n - i ) =å n - å i = n 2 - = -
i =1 i =1 i =1 2 2 2
Thus,T(n) = Q(n2)
Selection Sort
• Idea:
– Find the smallest element in the array
– Exchange it with the element in the first position
– Find the second smallest element and exchange it with
the element in the second position
– Continue until the array is sorted
• Disadvantage:
– Running time depends only slightly on the amount of
order in the file
Example
8 4 6 9 2 3 1 1 2 3 4 9 6 8
1 4 6 9 2 3 8 1 2 3 4 6 9 8
1 2 6 9 4 3 8 1 2 3 4 6 8 9
1 2 3 9 4 6 8 1 2 3 4 6 8 9
Selection Sort
Alg.: SELECTION-SORT(A)
n ← length[A] 8 4 6 9 2 3 1
for j ← 1 to n - 1
do smallest ← j
for i ← j + 1 to n
do if A[i] < A[smallest]
then smallest ← i
exchange A[j] ↔ A[smallest]
Analysis of Selection Sort
Alg.: SELECTION-SORT(A) cost times
n ← length[A] c1 1
for j ← 1 to n - 1 c2 n
do smallest ← j c3 n-1
»n2/2 for i ← j + 1 to n c4 ånj=-11 (n - j + 1)
comparisons
do if A[i] < A[smallest] c5 å
n -1
j =1
(n - j )
»n
exchanges then smallest ← i c6 å
n -1
j =1
(n - j )