SortingSorting
SortingKeeping data in “order” allows it to be searched more efficiently
Example: Phone Book– Sorted by Last Name (“lots” of work to do this)
• Easy to look someone up if you know their last name• Tedious (but straightforward) to find by First name or
Address
Important if data will be searched many times
Two algorithms for sorting today– Bubble Sort– Merge Sort
Searching: next lecture
Bubble Sort (“Sink” sort here)If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch …If A(N-3)>A(N-2) switchIf A(N-2)>A(N-1) switchIf A(N-1)>A(N) switch
If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch
If A(N-3)>A(N-2) switchIf A(N-2)>A(N-1) switch
If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch
If A(N-3)>A(N-2) switch
If A(1)>A(2) switch
A(N) is now largest entry
A(N-1) is now 2nd largest entry
A(N) is still largest enry
A(N-2) is now 3rd largest entry
A(N-1) is still 2nd largest entry
A(N) is still largest enry
A(1) is now Nth largest entry.
A(2) is still (N-1)th largest entry.
A(3) is still (N-2)th largest entry.
A(N-3) is still 4th largest entry
A(N-2) is still 3rd largest entry
A(N-1) is still 2nd largest entry
A(N) is still largest entry
Bubble Sort (“Sink” sort here)If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch …If A(N-3)>A(N-2) switchIf A(N-2)>A(N-1) switchIf A(N-1)>A(N) switch
If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch
If A(N-3)>A(N-2) switchIf A(N-2)>A(N-1) switch
If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch
If A(N-3)>A(N-2) switch
If A(1)>A(2) switch
N-1 steps
N-2 steps
N-3 steps
1 step
22)1( steps of #
21
1
NNNiN
i
Bubble Sort (“Sink” sort here)If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch …If A(N-3)>A(N-2) switchIf A(N-2)>A(N-1) switchIf A(N-1)>A(N) switch
If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch
If A(N-3)>A(N-2) switchIf A(N-2)>A(N-1) switch
If A(1)>A(2) switchIf A(2)>A(3) switchIf A(3)>A(4) switchIf A(4)>A(5) switch
If A(N-3)>A(N-2) switch
If A(1)>A(2) switch
for lastcompare=N-1:-1:1
for i=1:lastcompare
if A(i)>A(i+1)
Matlab code for Bubble Sortfunction S = bubblesort(A)% Assume A row/column; Copy A to SS = A;N = length(S);for lastcompare=N-1:-1:1 for i=1:lastcompare if S(i)>S(i+1) tmp = S(i); S(i) = S(i+1); S(i+1) = tmp; end endend
What about returning an Index vector Idx, with the property that S = A(Idx)?
Matlab code for Bubble Sortfunction [S,Idx] = bubblesort(A)% Assume A row/column; Copy A to SN = length(A);S = A; Idx = 1:N; % A(Idx) equals Sfor lastcompare=N-1:-1:1 for i=1:lastcompare if S(i)>S(i+1) tmp = S(i); tmpi = Idx(i); S(i) = S(i+1); Idx(i) = Idx(i+1); S(i+1) = tmp; Idx(i+1) = tmpi; end endend
If we switch two entries of S, then exchange the same two entries of Idx. This keeps A(Idx) equaling S
Merging two already sorted arrays
Suppose A and B are two sorted arrays (different lengths)
How do you “merge” these into a sorted array C?
Chalkboard…
Pseudo-code: Merging two already sorted arrays
function C = merge(A,B)nA = length(A); nB = length(B);iA = 1; iB = 1; %smallest unused elementC = zeros(1,nA+nB);for iC=1:nA+nB if A(iA)<B(iB) %compare smallest unused C(iC) = A(iA); iA = iA+1; %use A else C(iC) = B(iB); iB = iB+1; %use B endend
BA nn steps"" of #
MergeSortfunction S = mergeSort(A)n = length(A);if n==1 S = A;else hn = floor(n/2); S1 = mergeSort(A(1:hn)); S2 = mergeSort(A(hn+1:end)); S = merge(S1,S2);end
Base Case
Split in half
Sort 2nd half
Merge 2 sorted arrays
Sort 1st half
Rough Operation Count for MergeSort
Let R(n) denote the number of operations necessary to sort (using mergeSort) an array of length n.
function S = mergeSort(A)n = length(A);if n==1 S = A;else hn = floor(n/2); S1 = mergeSort(A(1:hn)); S2 = mergeSort(A(hn+1:end)); S = merge(S1,S2);end
R(1) = 0
R(n/2) to sort array of length n/2
n steps to merge two sorted arrays of total length n
R(n/2) to sort array of length n/2
Recursive relation: R(1)=0, R(n) = 2*R(n/2) + n
Rough Operation Count for MergeSortThe recursive relation for R R(1)=0, R(n) = 2*R(n/2) + nClaim: For n=2m, it is true that R(n) ≤ n log2(n)
Case (m=0): true, since log2(1)=0
Case (m=k+1 from m=k)
12 1 kk
kkk 222log22 2 kkR 2222 kk RR 222 1
12
1 2log2 kk
Recursive relation
Induction hypothesis
Matlab command: sortSyntax is [S] = sort(A)If A is a vector, then S is a vector in ascending
order
The indices which rearrange A into S are also available.
[S,Idx] = sort(A)
S is the sorted values of A, and A(Idx) equals S.