An** algorithm** is a precise and unambiguous *specification of a sequence of steps* that can be carried out mechanically. The notation in which an algorithm is expressed can be any commonly understood language, but in computer science algorithms are most often expressed formally as programs in a programming language, or in an informal style as a sequence of programming language constructs intermingled with English language statements. Most likely, you have already encountered several important algorithms while studying **programming**. For example, *there are a number of algorithms for sorting the elements of an array, that is, putting the elements in smallest-first order.*

There are clever searching algorithms such as **binary search**, which quickly finds a given element in a sorted array by repeatedly dividing in half the portion of the array in which the element could appear. These, and many other** “tricks”** for solving common problems, are among the tools the computer scientist uses when designing programs. We shall study many such techniques in this book, including the important methods for sorting and searching. In addition, we shall learn what makes one algorithm better than another. Frequently,* the running time, or time taken by an algorithm measured as a function of the size of its input,* is one important aspect of the **“quality” of the algorithm.**

Other aspects of **algorithms** are also important, particularly their **simplicity**. Ideally, an algorithm should be easy to understand and easy to turn into a *working program*. Also, the resulting program should be understandable by a person reading the code that implements the algorithm. Unfortunately, our desires for a fast algorithm and a simple algorithm are often in *conflict*, and we must choose our algorithm wisely.