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.