Examples using Arrays
Summing Squares
•
Problem: To compute the sum of the
squares of N numbers
•
N is given
•
N values are also given
•
These should be read and stored in an
array
The Program
Program sum_square
implicit none
integer:: N, Sum, Index, i
! N - the total number of items to be
summed
integer, dimension(100):: Arr
Sum = 0
read *,N
read *, (Arr(i), i= 1, N)
do index = 1, N
Sum = Sum + Arr(index) ** 2
end do
print *, Sum
end program
Another Example
•
Searching an
item in an array
–
Given an array of integers, check
whether a given integer is in the array or not
•
This is an abstraction of standard and important problem for
searching an item from a large collection of data items
•
Algorithm idea:
–
Examine each item in the array and compare
with the given item
–
If there is a match return success, return
failure otherwise
•
This is called Linear Search
The program
Program
l_search
implicit none
integer:: N, Index,
i, item
! N - the total number of items
to be summed
logical :: found
! logical variable that store the
search result
integer, dimension(100):: Arr
read *,item
read *,N
read *, (Arr(i), i=1, N)
found = .false.
do index = 1, N
if ( Arr(index) == item )
then
found = .true.
exit
endif
end do
print *, found
end program
Complexity of Linear
Searching
•
Total number of operations
–
depends
on the input
•
Worst case estimate
–
when
the given item is not present in the array
–
constant
number of operations per iteration
–
number
of iterations is N
–
Total
number of operations: (k*N)
•
Can we do better?
–
Yes,
if the array is sorted
–
(k*log
N) algorithm
Sorting
•
Sorting of data items is a
very standard task in various applications
–
Rank
students according to their marks
–
Order
animals in a zoo in the order of their weights
–
Obtain
the top 5% batsmen in one-day matches in a calendar year
–
Order
the world cup footballers in the order of their goals
•
Ascending and Descending
Orders
•
Sorting is a typical
example using arrays
Specification of Sorting
•
Input: A(1..N) is an array
of integers
•
Output: A(1..N) is the
sorted (in ascending order) version of old array
•
Sorted Version:
The
output A(1..N) is a permutation of old array.
It is, further sorted in ascending order
•
Examples:
Input: 9
3 4 8
10 34 2
7 11 10
Output:
2 3
4 7 8
9 10 10
11 34
How to do Sorting
Simplest
Strategy
•
Choose the smallest number
and place in the first position
•
Choose the next smallest
number and place in the second position
•
and so on
Illustration
23 5 5 5
12 12 12 12
37 37 37
23
5 23 23
37
The algorithm
Algorithm Sort
Input A(1:N)
Output A(1:N)
•
read
input values into A
•
i
= 1
•
while
(i < N)
3.1 find N >= j > i s.t. A(j) is the least element
in A(i:N)
3.2 swap A(i) and
A(j)
3.3 i = i+1
•
output
A(1:N)
•
This
algorithm is called Selection Sort
Program
Ssort
implicit none
integer:: N, i, j, min, temp ! N - total no. of items in array
integer, dimension(100):: Arr
print *, "input the size of the
array"
read *, N
print *, "Input the array elements
in the same line"
read *, (Arr(i), I = 1, N)
do i = 1, N
min = i
do j = i+1, N
if (Arr(min) > Arr(j))
then
min = j
endif
end do
temp = Arr(i)
Arr(i) = Arr(min)
Arr(min) = temp
end do
print *, (Arr(i),I = 1, N)
Analysis
•
Is the program Correct?
–
Find
loop invariants for the do-loops
•
How many number of
operations?
–
Iterations
count for the outer loop: N
–
Iteration
count for the inner one: (N-1) for 1st,
(N-2) for 2nd, ...
–
Total
operations 1 + 2 + 3 + ... (N-1) =
N(N-1)/2
•
Can we do better?
–
Yes,
More on this later
Bubble Sort
•
Most
sorting algorithms are based upon iterative swapping
•
Selection
sort, in each iteration, swaps A(i) with the least element in A(i+1),...,A(N)
•
Bubble
sort uses a simpler swap operation.
–
Swaps
adjacent elements if they are in the wrong order
•
Keep
iterating such swaps until no adjacent elements are in the wrong order
•
The
array is sorted then
An abstract algorithm
•
Here
is a very high level description
while there is a pair of adjacent elements in the wrong order
swap the two elements
end
•
The
details of algorithm is in systematically searching for the adjacent pair of
elements in the wrong order
•
Search
from left to right
A simple version
program b_sort
... declarations and reading inputs
do
do i = 1, (N-1)
if Arr(i) > Arr(i+1) then
temp = Arr(i)
Arr(i) = Arr(i+1)
Arr(i+1) = temp
swapped = .true.
endif
enddo
if (.not. ( swapped)) exit
enddo
print *, (Arr(i),i=1,N)
end program
An improvement
•
This algorithm is correct
(why?)
•
The inner loop `sweeps'
through the entire array in every iteration
•
Observe that in the I
iteration, the largest element goes rightmost, its right position
•
In the II iteration, the
second largest element reaches its destination and so on
•
Every successive iteration
needs to sweeps less and less to the right
•
The same is the case if
the array if already is sorted (in the right)
•
Bubblesort makes use of
this property
Bubblesort
program bubble_sort
... declarations and reading inputs
rt_end = N
do
if (rt_end < = 1) exit
index = 0
do i = 1, (rt_end-1)
if (A(i) > A(i+1)) then
temp = Arr(i)
Arr(i) = Arr(i+1)
Arr(i+1) = temp
index = i
endif
enddo
rt_end = index
enddo
print *, (Arr(i),i=1,N)
end program
Analysis
•
Is
the algorithm correct?
•
How
many number of operations?
•
Can
there be a better algorithm?
Sort before searching
•
Recall the Linear
Searching algorithm
•
N comparisons are required
•
One has to look at all the
items
•
Can we avoid looking at
all items?
•
It appears no but actually
one need not, if the array is sorted
•
In a sorted array, every
section containing the item has:
–
left most item less than
or equals and
–
right most item greater
than or equals
the searched item
•
We give an algorithm
exploiting this fact
Binary Search Algorithm
•
Idea:
– Obtain an initial section possibly
containing the searched item
– Keep reducing the size of the section
until
– the section contains just one or two elements
•
What is the initial
section?
The
entire array if the given item
>
= first item
<
= last item
•
How to reduce a given
section?
–
If the section contains k
elements, break it into two (hence binary) sections, at most one of which will possibly contain
the element
Program
bin_search
....
integer *, left, right
left = 1
right = N
do
If ((A(left)>x) .or. (A(right)
< x)) then
print *, "Not found"
exit
end if
mid = (left + right)/2
If (A(mid)< x) then
left = mid + 1
elseif (A(mid)>x) then
right = mid
else
print *, x," is found at
index ", mid
exit
end if
end do
Analysis of the algorithm
•
Is
the program correct?
•
What
is the loop invariant?
•
Does
the loop terminate?
•
How
many comparison?
•
Log
N in the worst case
•
Can
we do better? No.