Sorting
and Searching
Applications
of Arrays
•     one
of the most common problems
•     sorting
–   arrange a
set of numbers or character strings in ascending order
•     searching
–   given a
number or string, is it contained in the set?
•     telephone
directory
Sorting
•     array
marks contains marks of students
•     arrange
them in non-decreasing order 
•     once
arranged, many questions can be answered easily
–   find the top
10 marks
–   find the
median marks
–   how many
students have marks = m
–   find the
mode ( the most frequent marks)
Simple
Sorting Algorithm
•     find
the smallest number
•     put
it in the first position
•     from
remaining numbers find the smallest
•     put
it in the second position
•     repeatedly
fill in a position in the sorted array by finding smallest remaining number
•     repetitions
have to be done n-1 times
•     called
selection sort
Selection
Sort
do
i = 1, n-1
min_pos = i 
do
j = i+1, n
if
(marks(j) < marks(min_pos))  min_pos
= j
end do 
! min_pos is index of minimum in marks(i:n)
temp = marks(i)
marks(i) = marks(min_pos)
marks(min_pos) = temp
end do
 
Loop
Invariants
•     write
loop invariants for selection sort
•     outer
loop
–   marks(1:i-1)
is in non-decreasing order
–   marks(k)
>= marks(i-1) for all i<=k<=n
•     inner
loop
–   marks(min_pos)
<= marks(k) for all i<=k<=j-1
•     together
they imply that after n-1 outer iterations, the array is sorted
Selection
Sort
•     not
very efficient
•     for
sorting n values, number of operations is proportional to n2 
•     the
number is insensitive to the input
–   same number
of operations required even if the input is already sorted
•     very
simple
•     no
extra array required
•     movement
of data is minimum possible
Bubble
Sort
•     selection
sort is based on ensuring that a(i) <= a(j) for all 1 <= i < j <= n
•     a
weaker condition is sufficient for sorting
–   a(i) <=
a(i+1) for 1 <= i < n
•     bubble
sort based on ensuring this
•     compare
adjacent numbers and swap if larger number occurs before the smaller
•     repeat
till no swaps are possible
 
Bubble
Sort
limit = n ! limit indicates section of array
to be sorted
do
if
(limit <= 1) exit
last_swap = 0           ! rightmost position of swap
do
i = 1,  limit-1
if
(a(i) > a(i+1)) then
temp =a(i) ; a(i) = a(i+1) ; a(i+1) = temp;
last_swap = i
endif
end do
limit = last_swap
end do
Bubble
Sort
•     in
the worst case bubble sort can still require n2
operations – when?
•     better
in some cases like already sorted input
•     what
is a loop invariant for bubble sort?
•     a(1:limit)
is the section still to be sorted
•     a(limit+1:n)
is already sorted
•     a(i)
<= a(limit+1) for 1 <= i <= limit
 
Searching
•     how
many students have scored m marks?
•     marks
stored in an array
•     if
array is unsorted value of every element would have to be checked
•     can
do better if it is sorted
•     how?
– use binary search
•     find
indices i, j such that a(i-1) < m <= a(i) and a(j-1) <= m < a(j),
j-i is the answer
Binary
Search
•     search
for index i such that a(i-1)<m<=a(i)
•     initially,
possible values of i are from 1 to n+1
•     compare
with a((n+1)/2) ( middle element)
•     if
a((n+1)/2) < m then required i > (n+1)/2 else required i <= (n+1)/2
•     possible
values of i have been halved
•     repeat
for appropriate interval of values
•     after
log2 n + 1 comparisons, i is
found
Binary
Search
left = 1; right = n+1
! left and right are endpoints of interval
containing i
do
if
( left == right ) exit
if marks((left+right)/2) < m) then
left = (left+right)/2+1
else
right = (left+right)/2
endif
end do
 
Binary
Search
•     loop
invariant for binary search
•     marks(1:left-1)
< m 
•     marks(right:n)
>= m
•     when
left == right, required i = left =right
•     in
each iteration, right-left is halved
•     number
of iterations is at most log2
n + 1
•     same
method can be used for many other problems
Faster
Sorting Algorithms
•     there
are sorting algorithms which take less time than selection or bubble sort
•     many
different sorting algorithms are known
•     merge
sort
–   divide
numbers to be sorted into two parts
–   sort each
part using the same method
–   merge the
two sorted sequences into a single sorted sequence
Summary
•     sorting
and searching are basic tasks 
•     many
sorting algorithms
–   selection
sort
–   bubble sort
–   merge sort (
details later)
•     binary
search
–   needs sorted
arrays
–   faster than
simple search