0% found this document useful (0 votes)
3 views60 pages

Chapter 08

Chapter 8 discusses algorithms, defining them as step-by-step methods for problem-solving and outlining constructs such as sequence, decision, and repetition. It covers pseudocode, UML diagrams, and basic algorithms for sorting and searching, including their mechanisms. The chapter also distinguishes between iterative and recursive algorithms, providing examples and applications for each.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views60 pages

Chapter 08

Chapter 8 discusses algorithms, defining them as step-by-step methods for problem-solving and outlining constructs such as sequence, decision, and repetition. It covers pseudocode, UML diagrams, and basic algorithms for sorting and searching, including their mechanisms. The chapter also distinguishes between iterative and recursive algorithms, providing examples and applications for each.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 60

CHAPTER 8

Algorithms
q Define an algorithm and relate it to problem solving.
q Define three construct and describe their use in algorithms.
q Describe pseudocode and how they are used in algorithms.
q Describe UML diagrams and how they are used in algorithms.
q List basic algorithms and their applications.
q Describe the concept of sorting and understand the mechanisms
behind three primitive sorting algorithms.
q Describe the concept of searching and understand the
mechanisms behind two common searching algorithms.
q Define subalgorithms and their relations to algorithms.
q Distinguish between iterative and recursive algorithms
8.1.1 Informal definition
An informal definition of an algorithm is:
Algorithm: a step-by-step method for solving a problem
or doing a task.

Figure 8.1 Informal definition of an algorithm used in a computer


8.1.2 Example
Let us elaborate on this simple definition with an example.
We want to develop an algorithm for finding the largest
integer among a list of positive integers. The algorithm
should find the largest integer among a list of any size (for
example 5, 1000, 10 000, 1 000 000). The algorithm should
be general and not depend on the number of integers.

It is obvious that finding the largest integer among


many integers is a task that cannot be done in one step,
either by a human or a computer. The algorithm needs to
test each integer one by one.
To solve this problem, we need an intuitive approach.
First use a small number of integers (for example, five),
then extend the solution to any number of integers. Our
solution for five integers follows the same principles and
restrictions for one thousand or one million integers.
Assume, even for a five-integer case, that the algorithm
handles the integers one by one. It looks at the first integer
without knowing the values of the remaining integers. After
it handles the first one, it looks at the second integer, and so
on. Figure 8.2 shows one way to solve this problem.

We call the algorithm FindLargest. Each algorithm


has a name to distinguish it from other algorithms. The
algorithm receives a list of five integers as input and gives
the largest integer as output.
Figure 8.2 Finding the largest integer among five integers
Input
The algorithm accepts the list of five integers as input.

Processing
The algorithm uses the five steps to find the largest integer:

Output
Because there are no more integers to be processed, the
algorithm outputs the value of Largest, which is 13.
8.1.3 Defining actions
Figure 8.2 does not show what should be done in each step.
We can modify the figure to show more details.
Figure 8.3 Defining actions in FindLargest algorithm
8.1.4 Refinement
This algorithm needs refinement to be acceptable to the
programming community. There are two problems. First, the
action in the first step is different than those for the other
steps. Second, the wording is not the same in steps 2 to 5.
We can easily redefine the algorithm to remove these two
inconveniences by changing the wording in steps 2 to 5 to
“If the current integer is greater than Largest, set Largest to
the current integer.” The reason that the first step is different
than the other steps is because Largest is not initialized. If
we initialize Largest to −∞ (minus infinity), then the first
step can be the same as the other steps, so we add a new
step, calling it step 0 to show that it should be done before
processing any integers.
Figure 8.4 FindLargest refined
8.1.5 Generalization
Is it possible to generalize the algorithm? We want to find
the largest of n positive integers, where n can be 1000,
1,000,000, or more. Of course, we can follow Figure 8.4 and
repeat each step. But if we change the algorithm to a
program, then we need to actually type the actions for n
steps!
There is a better way to do this. We can tell the
computer to repeat the steps n times. We now include this
feature in our pictorial algorithm (Figure 8.5).
Figure 8.5 Generalization of FindLargest
8.14
Figure 8.6 Three constructs
8.2.1 Sequence
The first construct is called the sequence. An algorithm, and
eventually a program, is a sequence of instructions, which
can be a simple instruction or either of the other two
constructs.

8.2.2 Decision
Some problems cannot be solved with only a sequence of
simple instructions. Sometimes we need to test a condition.
If the result of testing is true, we follow a sequence of
instructions: if it is false, we follow a different sequence of
instructions. This is called the decision (selection) construct.

8.16
8.2.3 Repetition
In some problems, the same sequence of instructions must be
repeated. We handle this with the repetition or loop
construct. Finding the largest integer among a set of integers
can use a construct of this kind.

8.17
8.18
8.3.1 UML
Unified Modeling Language (UML) is a pictorial
representation of an algorithm. It hides all the details of an
algorithm in an attempt to give the “big picture” and to show
how the algorithm flows from beginning to end. UML is
covered in detail in Appendix B. Here we show only how the
three constructs are represented using UML (Figure 8.7).

8.19
Figure 8.7 UML for three constructs
8.3.2 Pseudocode
Pseudocode is an English-language-like representation of an
algorithm. There is no standard for pseudocode—some
people use a lot of detail, others use less. Some use a code
that is close to English, while others use a syntax like the
Pascal programming language. Pseudocode is covered in
detail in Appendix C. Here we show only how the three
constructs can be represented by pseudocode (Figure 8.8).

8.21
Figure 8.8 Pseudocode for three constructs
Example 8.1

Solution
Example 8.2

Solution
Example 8.3 8.3

Solution
Example 8.4

Solution
Example 8.5

Solution
Algorithm: An ordered set of unambiguous steps that
produces a result and terminates in a finite time.

8.28
8.4.1 Well-Defined
An algorithm must be a well-defined, ordered set of
instructions.
8.4.2 Unambiguous steps
Each step in an algorithm must be clearly and
unambiguously defined. If one step is to add two integers,
we must define both “integers” as well as the “add”
operation: we cannot for example use the same symbol to
mean addition in one place and multiplication somewhere
else.
8.4.3 Produce a result
An algorithm must produce a result, otherwise it is useless.
The result can be data returned to the calling algorithm, or
some other effect (for example, printing).
8.4.3 Terminate in a finite time
An algorithm must terminate (halt). If it does not (that is, it
has an infinite loop), we have not created an algorithm. In
Chapter 17 we will discuss solvable and unsolvable
problems, and we will see that a solvable problem has a
solution in the form of an algorithm that terminates.

8.30
8.5.1 Summation
One commonly used algorithm in computer science is
summation. We can add two or three integers very easily,
but how can we add many integers? The solution is simple:
we use the add operator in a loop (Figure 8.9).

A summation algorithm has three logical parts:


1. Initialization of the sum at the beginning.
2. The loop, which in each iteration adds a new integer to
the sum.
3. Return of the result after exiting from the loop.
Figure 8.9 Summation algorithm
8.5.2 Product
Another common algorithm is finding the product of a list of
integers. The solution is simple: use the multiplication
operator in a loop (Figure 8.10).

A product algorithm has three logical parts:


1. Initialization of the product at the beginning.
2. The loop, which in each iteration multiplies a new
integer with the product.
3. Return of the result after exiting from the loop.
Figure 8.10 Product algorithm
8.5.3 Smallest and largest
We discussed the algorithm for finding the largest among a
list of integers at the beginning of this chapter. The idea was
to write a decision construct to find the larger of two
integers. If we put this construct in a loop, we can find the
largest of a list of integers.
Finding the smallest integer among a list of integers is
similar, with two minor differences. First, we use a decision
construct to find the smaller of two integers. Second, we
initialize with a very large integer instead of a very small
one.
Figure 8.11 Finding the smallest data item
8.5.4 Sorting
One of the most common applications in computer science is
sorting, which is the process by which data is arranged
according to its values. People are surrounded by data. If the
data was not ordered, it would take hours and hours to find a
single piece of information. Imagine the difficulty of finding
someone’s telephone number in a telephone book that is not
ordered.
In this section, we introduce three sorting algorithms:
selection sort, bubble sort, and insertion sort. These three
sorting algorithms are the foundation of faster sorting
algorithms used in computer science today.
Selection sorts
In a selection sort, the list to be sorted is divided into two
sublists—sorted and unsorted—which are separated by an
imaginary wall. We find the smallest element from the
unsorted sublist and swap it with the element at the
beginning of the unsorted sublist. After each selection and
swap, the imaginary wall between the two sublists moves
one element ahead.
Figure 8.12 Selection sort
Figure 8.13 Example of selection sort
Figure 8.13 Selection sort algorithm
Bubble sorts
In the bubble sort method, the list to be sorted is also divided
into two sublists—sorted and unsorted. The smallest element
is bubbled up from the unsorted sublist and moved to the
sorted sublist. After the smallest element has been moved to
the sorted list, the wall moves one element ahead.

Figure 8.15 Bubble sort


Figure 8.16 Example of bubble sort
Insertion sorts
The insertion sort algorithm is one of the most common
sorting techniques, and it is often used by card players. Each
card a player picks up is inserted into the proper place in
their hand of cards to maintain a particular sequence.

Figure 8.17 Insertion sort


Figure 8.18 Example of insertion sort
8.5.5 Searching
Another common algorithm in computer science is
searching, which is the process of finding the location of a
target among a list of objects. In the case of a list, searching
means that given a value, we want to find the location of the
first element in the list that contains that value. There are two
basic searches for lists: sequential search and binary
search. Sequential search can be used to locate an item in
any list, whereas binary search requires the list first to be
sorted.
Sequential search
Sequential search is used if the list to be searched is not
ordered. Generally, we use this technique only for small lists,
or lists that are not searched often. In other cases, the best
approach is to first sort the list and then search it using the
binary search discussed later.

In a sequential search, we start searching for the target from


the beginning of the list. We continue until we either find the
target or reach the end of the list.
Figure 8.19 An example of a sequential search
Binary search
The sequential search algorithm is very slow. If we have a
list of a million elements, we must do a million comparisons
in the worst case. If the list is not sorted, this is the only
solution. If the list is sorted, however, we can use a more
efficient algorithm called binary search. Generally speaking,
programmers use a binary search when a list is large.

A binary search starts by testing the data in the


element at the middle of the list. This determines whether the
target is in the first half or the second half of the list. If it is
in the first half, there is no need to further check the second
half. If it is in the second half, there is no need to further
check the first half. In other words, we eliminate half the list
from further consideration.
Figure 8.20 Example of a binary search
Figure 8.21 Concept of a subalgorithm
8.6.1 Structure chart
Another tool programmers use is the structure chart. A
structure chart is a high level design tool that shows the
relationship between algorithms and subalgorithms. It is
used mainly at the design level rather than at the
programming level. We briefly discuss the structure chart in
Appendix D.
8.7.1 Iterative definition
To study a simple example, consider the calculation of a
factorial. The factorial of a integer is the product of the
integral values from 1 to the integer. The definition is
iterative (Figure 8.21). An algorithm is iterative whenever
the definition does not involve the algorithm itself.

Figure 8.22 Iterative definition of factorial


8.7.2 Recursive definition
An algorithm is defined recursively whenever the algorithm
appears within the definition itself. For example, the
factorial function can be defined recursively as shown in
Figure 8.22.
Figure 8.23 Recursive definition of factorial
Figure 8.24 Tracing the recursive solution to the factorial problem
Iterative solution
This solution usually involves a loop.
Recursive solution
The recursive solution does not need a loop, as the recursion
concept itself involves repetition.

You might also like