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