80 likes | 676 Vues
Insertion Sort – review of loop invariants. Insertion Sort. Problem: sort n numbers in A [1.. n ]. Input: n, numbers in A Output: A in sorted order: i [2.. n ], A [ i -1] <= A [ i ]. f or j=2 to len gth (A) do key=A[j] i =j-1 while i>0 and A[i]>key
E N D
Insertion Sort • Problem: sort n numbers in A[1..n]. • Input: n, numbers in A • Output: A in sorted order: i [2..n], A[i-1] <= A[i] forj=2 to length(A) dokey=A[j] i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]=key Comp 122
Loop Invariants • Invariants– statements about an algorithm that remain valid • We must show three things about loop invariants: • Initialization – statement is true before first iteration • Maintenance – if it is true before an iteration, then it remains true before the next iteration • Termination – when loop terminates the invariant gives a useful property to show the correctness of the algorithm Comp 122
Example: Insertion Sort • Invariant: at the start of each for loop, A[1…j-1] consists of elements originally in A[1…j-1] but in sorted order forj=2 to length(A) dokey=A[j] i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]=key Comp 122
Example: Insertion Sort • Invariant: at the start of each for loop, A[1…j-1] consists of elements originally in A[1…j-1] but in sorted order forj=2 to length(A) dokey=A[j] i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key • Initialization: j = 2, the invariant trivially holds because A[1] is a sorted array. √ Comp 122
Example: Insertion Sort • Invariant: at the start of each for loop, A[1…j-1] consists of elements originally in A[1…j-1] but in sorted order forj=2 to length(A) dokey=A[j] i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key • Maintenance: the inner while loop finds the position i with A[i] <= key, and shifts A[j-1], A[j-2], …, A[i+1] right by one position. Then key, formerly known as A[j], is placed in position i+1 so that A[i] £A[i+1] <A[i+2]. A[1…j-1] sorted + A[j] ® A[1…j] sorted Comp 122
Example: Insertion Sort • Invariant: at the start of each for loop, A[1…j-1] consists of elements originally in A[1…j-1] but in sorted order forj=2 to length(A) dokey=A[j] i=j-1 while i>0 and A[i]>key do A[i+1]=A[i] i-- A[i+1]:=key • Termination: the loop terminates, when j=n+1. Then the invariant states: “A[1…n] consists of elements originally in A[1…n] but in sorted order.” √ Comp 122