S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS...

81
S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL: . Learn the various search algorithms . Explore how to implement the sequential and binary search algorithms . Discover how the sequential and binary search algorithms perform . Become aware of the lower bound on comparison-based search algorithms . Learn the various sorting algorithms . Explore how to implement the bubble, selection, insertion, quick, and merge sorting algorithms . Discover how the sorting algorithms discussed in this chapter perform 18 CHAPTER

Transcript of S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS...

Page 1: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

SEARCHING AND SORTING

ALGORITHMSIN THIS CHAPTER , YOU WILL :

. Learn the various search algorithms

. Explore how to implement the sequential and binary search algorithms

. Discover how the sequential and binary search algorithms perform

. Become aware of the lower bound on comparison-based search algorithms

. Learn the various sorting algorithms

. Explore how to implement the bubble, selection, insertion, quick, and merge sorting algorithms

. Discover how the sorting algorithms discussed in this chapter perform

18C H A P T E R

Page 2: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Chapters 12 and 13 described how to organize data into computer memory usingan array and how to perform basic operations on that data. Chapter 16 describedhow to organize data using linked lists. The most important operation that can beperformed on a list is the search algorithm. Using the search algorithm, you can dothe following:

• Determine whether a particular item is in the list.

• If the data is specially organized (e.g., sorted), find the location in the listwhere a new item can be inserted.

• Find the location of an item to be deleted.

The search algorithm’s performance, therefore, is crucial. If the search is slow, it takes alarge amount of computer time to accomplish your task; if the search is fast, you canaccomplish your task quickly.

In the first part of this chapter, we describe the search algorithms: sequential search andbinary search. Certain search algorithms work only on sorted data. Therefore, the secondhalf of this chapter discusses various sorting algorithms.

Searching and Sorting AlgorithmsThe searching and sorting algorithms that we describe are generic. Because searchingand sorting require comparisons of data, the algorithms should work on the type of datathat provides appropriate functions to compare data items. Now data can be organizedwith the help of an array or a linked list. You can create an array of data items, or you canuse the class unorderedLinkedList to organize data. The algorithms that wedescribe should work on either organization. Consequently, we will write the functiontemplates to implement a particular algorithm. All algorithms described in this chapter,with the exception of the merge sort algorithms, are for array-based lists. Because ofstorage issues and some other overheads, merge sort works better for linked lists. There-fore, after describing the merge sort algorithm, we will add it as a function to theclass unorderedLinkedList. We will also show how to use the searching andsorting algorithms on objects of the class unorderedArrayListType. Moreover,we will place all of the array-based searching and sorting functions in the header filesearchSortAlgorithms.h. Therefore, if you need to use a particular searching and/or sorting function designed in this chapter, your program can include this header fileand use that function.

Search AlgorithmsChapters 12, 13, and 16 described how to implement the sequential search algorithm.This chapter discusses other search algorithms and analyzes them. Analysis of the algo-rithms enables programmers to decide which algorithm to use for a specific application.Before exploring these algorithms, let us make the following observations.

1224 | Chapter 18: Searching and Sorting Algorithms

Page 3: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Associated with each item in a data set is a special member that uniquely identifies theitem in the data set. For example, if you have a data set consisting of student records, thenthe student ID uniquely identifies each student in a particular school. This uniquemember of the item is called the key of the item. The keys of the items in the data setare used in such operations as searching, sorting, inserting, and deleting. For instance,when we search the data set for a particular item, we compare the key of the item forwhich we are searching with the keys of the items in the data set.

When analyzing searching and sorting algorithms, the key comparisons refer to compar-ing the key of the search item with the key of an item in the list. The number of keycomparisons refers to the number of times the key of the search item (in algorithms suchas searching and sorting) is compared with the keys of the items in the list.

Sequential SearchThe sequential search (also called a linear search) on array-based lists was described inChapters 12 and 13, and the sequential search on linked lists was covered in Chapter 16.The sequential search works the same for both array-based and linked lists. The searchalways starts at the first element in the list and continues until either the item is found inthe list or the entire list is searched.

Because we are interested in the performance of the sequential search (that is, the analysisof this type of search), for easy reference and the sake of completeness, we provide thesequential search algorithm for array-based lists (as described in Chapters 12 and 13). Ifthe search item is found, its index (that is, its location in the array) is returned. If thesearch is unsuccessful, -1 is returned. Note that the following sequential search does notrequire the list elements to be in any particular order.

template <class elemType>int seqSearch(const elemType list[], int length,

const elemType& item){

int loc;bool found = false;

loc = 0;

while (loc < length && !found)if (list[loc] == item)

found = true;else

loc++;

if (found)return loc;

elsereturn -1;

} //end seqSearch

18

Search Algorithms | 1225

Page 4: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

The sequential search algorithm, as given here, uses an iterative control structure

(the while loop) to compare the search item with the list elements. You can also write

a recursive algorithm to implement the sequential search algorithm. (See Programming

Exercise 1 at the end of this chapter.)

SEQUENTIAL SEARCH ANALYSIS

This section analyzes the performance of the sequential search algorithm in both theworst case and the average case.

The statements before and after the loop are executed only once and hence require verylittle computer time. The statements in the while loop are the ones that are repeatedseveral times. For each iteration of the loop, the search item is compared with an elementin the list, and a few other statements are executed, including some other comparisons.Clearly, the loop terminates as soon as the search item is found in the list. Therefore,execution of the other statements in the loop is directly related to the outcome of the keycomparison. Also, different programmers might implement the same algorithm differ-ently, although the number of key comparisons would typically be the same. The speedof a computer can also easily affect the time an algorithm takes to perform, but it, ofcourse, does not affect the number of key comparisons required.

Therefore, when analyzing a search algorithm, we count the number of key comparisonsbecause this number gives us the most useful information. Furthermore, the criteria forcounting the number of key comparisons can be applied equally well to other searchalgorithms.

Suppose that L is a list of length n. We want to determine the number of key comparisonsmade by the sequential search when the list L is searched for a given item.

If the search item is not in the list, we then compare the search item with every elementin the list, making n comparisons. This is an unsuccessful case.

Suppose that the search item is in the list. Then, the number of key comparisons dependson where in the list the search item is located. If the search item is the first element of L,we make only one key comparison. This is the best case. On the other hand, if the searchitem is the last element in the list, the algorithm makes n comparisons. This is the worstcase. The best and worst cases are not likely to occur every time we apply the sequentialsearch on L, so it would be more helpful if we could determine the average behavior ofthe algorithm. That is, we need to determine the average number of key comparisons thesequential search algorithm makes in the successful case.

To determine the average number of comparisons in the successful case of the sequentialsearch algorithm:

1. Consider all possible cases.

2. Find the number of comparisons for each case.

3. Add the number of comparisons and divide by the number of cases.

1226 | Chapter 18: Searching and Sorting Algorithms

Page 5: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

If the search item, called the target, is the first element in the list, one comparison isrequired. If the target is the second element in the list, two comparisons are required.Similarly, if the target is the kth element in the list, k comparisons are required. Weassume that the target can be any element in the list; that is, all list elements are equallylikely to be the target. Suppose that there are n elements in the list. The followingexpression gives the average number of comparisons:

1þ 2þ � � � þ n

n:

It is known that:

1þ 2þ � � � þ n ¼ nðnþ 1Þ2

:

Therefore, the following expression gives the average number of comparisons made bythe sequential search in the successful case:

1þ 2þ � � � þ n

n¼ 1

n

nðnþ 1Þ2

¼ nþ 1

2:

This expression shows that, on average, a successful sequential search searches half ofthe list. It thus follows that if the list size is 1,000,000, on average, the sequential searchmakes 500,000 comparisons. As a result, the sequential search is not efficient for largelists.

Binary SearchAs you can see, the sequential search is not efficient for large lists because, on average, itsearches half the list. We, therefore, describe another search algorithm called the binary

search, which is very fast. However, a binary search can be performed only on sortedlists. We, therefore, assume that the list is sorted. Later in this chapter, we will describeseveral sorting algorithms.

The binary search algorithm uses the ‘‘divide and conquer’’ technique to search the list.First, the search item is compared with the middle element of the list. If the search item isless than the middle element of the list, we restrict the search to the first half of the list;otherwise, we search the second half of the list.

Consider the sorted list of length = 12 in Figure 18-1.

18

Search Algorithms | 1227

Page 6: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Suppose that we want to determine whether 75 is in the list. Initially, the entire list is thesearch list (see Figure 18-2).

First, we compare 75 with the middle element in this list, list[5] (which is 39).Because 75 6¼ list[5] and 75 > list[5], we then restrict our search to the listlist[6]...list[11], as shown in Figure 18-3.

This process is now repeated on the list list[6]...list[11], which is a list oflength = 6.

Because we need to determine the middle element of the list frequently, the binary searchalgorithm is typically implemented for array-based lists. To determine the middle elementof the list, we add the starting index, first, and the ending index, last, of the search listand then divide by 2 to calculate its index. That is:

mid ¼ firstþ last

2.

4list 8 19 25 34 39 45 48 66 75 89 95

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9][10][11]

FIGURE 18-1 List of length 12

4list 8 19 25 34 39 45 48 66 75 89 95

[0] [1] [2] [3] [4] [5]

mid

search list

[6] [7] [8] [9][10][11]

FIGURE 18-2 Search list, list[0]...list[11]

4list 8 19 25 34 39 45 48 66 75 89 95

[0] [1] [2] [3] [4] [5]

search list

[6] [7] [8] [9][10][11]

FIGURE 18-3 Search list, list[6]...list[11]

1228 | Chapter 18: Searching and Sorting Algorithms

Page 7: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Initially, first = 0 and last = length – 1 (this is because an array index in C++ startsat 0, and length denotes the number of elements in the list).

The following C++ function implements the binary search algorithm. If the item isfound in the list, its location is returned; if the search item is not in the list, -1 is returned.

template <class elemType>int binarySearch(const elemType list[], int length,

const elemType& item){

int first = 0;int last = length - 1;int mid;

bool found = false;

while (first <= last && !found){

mid = (first + last) / 2;

if (list[mid] == item)found = true;

else if (list[mid] > item)last = mid - 1;

elsefirst = mid + 1;

}

if (found)return mid;

elsereturn -1;

} //end binarySearch

In the binary search algorithm, each time through the loop, we make two key compar-isons. The only exception is in the successful case; the last time through the loop, onlyone key comparison is made.

The binary search algorithm, as given in this chapter, uses an iterative control structure

(the while loop) to compare the search item with the list elements. You can also write

a recursive algorithm to implement the binary search algorithm. (See Programming

Exercise 2 at the end of this chapter.)

Example 18-1 further illustrates how the binary search algorithm works.

18

Search Algorithms | 1229

Page 8: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

EXAMPLE 18-1

Consider the list given in Figure 18-4.

The size of this list is 12; that is, the length is 12. Suppose that we are searching foritem 89. Table 18-1 shows the values of first, last, and mid each time through theloop. It also shows the number of times the item is compared with an element in the listeach time through the loop.

The item is found at location 10, and the total number of comparisons is 5.

Next, let us search the list for item 34. Table 18-2 shows the values of first, last, andmid each time through the loop. It also shows the number of times the item is comparedwith an element in the list each time through the loop.

4list 8 19 25 34 39 45 48 66 75 89 95

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9][10][11]

FIGURE 18-4 Sorted list for a binary search

TABLE 18-1 Values of first, last, and mid and the Number of Comparisons for SearchItem 89

Iteration first last mid list[mid]Number ofcomparisons

1 0 11 5 39 2

2 6 11 8 66 2

3 9 11 10 89 1 (found is true)

1230 | Chapter 18: Searching and Sorting Algorithms

Page 9: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

The item is found at location 4, and the total number of comparisons is 7.

Let us now search for item 22, as shown in Table 18-3.

This is an unsuccessful search. The total number of comparisons is 6.

Example 18-2 illustrates how to use the binary search algorithm in a program.

EXAMPLE 18-2

#include <iostream>#include "searchSortAlgorithms.h"

using namespace std;

int main()

18

TABLE 18-3 Values of first, last, and mid and the Number of Comparisons for SearchItem 22

Iteration first last mid list[mid]Number ofcomparisons

1 0 11 5 39 2

2 0 4 2 19 2

3 3 4 3 25 2

4 3 2 the loop stops (because first > last)

TABLE 18-2 Values of first, last, and mid and the Number of Comparisons for SearchItem 34

Iteration first last mid list[mid]Number ofcomparisons

1 0 11 5 39 2

2 0 4 2 19 2

3 3 4 3 25 2

4 4 4 4 34 1 (found is true)

Search Algorithms | 1231

Page 10: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

{int intList[] = {2, 16, 34, 45, 53,

56, 69, 70, 75, 96}; //Line 1

int pos; //Line 2

pos = binarySearch(intList, 10, 45); //Line 3

if (pos != -1) //Line 4cout << "Line 5: " << 45

<< " found at position "<< pos << endl; //Line 5

else //Line 6cout << "Line 7: " << 45

<< " is not in intList " << endl; //Line 7return 0;

}

Sample Run:

Line 5: 45 found at position 3

The preceding program works as follows. The statement in Line 1 creates the arrayintList. (Note that the array intList is sorted.) The statement in Line 2 declares posto be an int variable. The statement in Line 3 uses the binary search algorithm todetermine whether 45 is in intList. Note that the array intList, its lengths, and thesearch item, which is 45, are passed as parameters to the function binarySearch. Thestatements in Lines 4 to 7 output the result of the search, which is successful.

Performance of Binary SearchSuppose that L is a sorted list of size 1024 and we want to determine if an item x is in L.From the binary search algorithm, it follows that every iteration of the while loop cutsthe size of the search list by half. (For example, see Figures 18-2 and 18-3.) Because1024 ¼ 210, the while loop will have, at most, 11 iterations to determine whether x is inL. Because every iteration of the while loop makes two item (key) comparisons, that is, xis compared twice with the elements of L, the binary search will make, at most, 22comparisons to determine whether x is in L. On the other hand, recall that a sequentialsearch on average will make 512 comparisons to determine whether x is in L.

To better understand how fast binary search is compared to sequential search, supposethat L is of size 1048576. Because 1048576 ¼ 220, it follows that the while loop in abinary search will have, at most, 21 iterations to determine whether an element is inL. Every iteration of the while loop makes two key (that is, item) comparisons. There-fore, to determine whether an element is in L, a binary search makes, at most, 42 itemcomparisons.

Note that 40 ¼ 2 * 20 ¼ 2 * log2220 ¼ 2 * log2(1048576).

1232 | Chapter 18: Searching and Sorting Algorithms

Page 11: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

In general, suppose that L is a sorted list of size n. Moreover, suppose that n is a power of2, that is, n ¼ 2m, for some nonnegative integer m. After each iteration of the while loop,about half of the elements are left to search, that is, the search sublist for the next iterationis half the size of the current sublist. For example, after the first iteration, the search sublistsize is about n=2 ¼ 2m�1. It is easy to see that the maximum number of the iteration ofthe while loop is about m + 1. Also, m ¼ log2n. Each iteration makes two keycomparisons. Thus, the maximum number of comparisons to determine whether anelement x is in L is 2(m + 1) ¼ 2(log2n + 1) ¼ 2log2n + 2.

In the case of a successful search, it can be shown that for a list of length n, on average, abinary search makes 2log2n – 3 key comparisons. In the case of an unsuccessful search, itcan be shown that for a list of length n, a binary search makes approximately 2log2n keycomparisons.

Binary Search Algorithm and the classorderedArrayListTypeThe class orderedArrayListType, designed in Chapter 13, does not contain thebinary search algorithm. Now that you know how to implement the binary searchalgorithm, you can learn how to use it in the class orderedArrayListType.

To use the binary search algorithm within the class orderedArrayListType, we addthe function binSearch to this class and call the functions binarySearch with theappropriate parameters.

#include "arrayListType.h"#include "searchSortAlgorithms.h"

template <class elemType>class orderedArrayListType: public arrayListType<elemType>{public:

void insertAt(int location, const elemType& insertItem);void insertEnd(const elemType& insertItem);void replaceAt(int location, const elemType& repItem);int seqSearch(const elemType& searchItem) const;void insert(const elemType& insertItem);void remove(const elemType& removeItem);

int binSearch(const elemType& removeItem);

orderedArrayListType(int size = 100);//Constructor

};

The definition of the member function binSearch is:

template <class elemType>int orderedArrayListType<elemType>::

binSearch(const elemType& item) const

18

Search Algorithms | 1233

Page 12: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

{return binarySearch(list, length, item);

}

Asymptotic Notation: Big-O NotationJust as a problem is analyzed before writing the algorithm and the computer program, after analgorithm is designed, it should also be analyzed. Usually, there are various ways to design aparticular algorithm. Certain algorithms take very little computer time to execute, whileothers take a considerable amount of time. Consider the following examples.

EXAMPLE 18-3

Consider the following algorithm (assume that all variables are properly declared):

cout << "Enter the first number: "; //Line 1cin >> num1; //Line 2cout << endl; //Line 3

cout << "Enter the second number: "; //Line 4cin >> num2; //Line 5cout << endl; //Line 6

if (num1 >= num2) //Line 7max = num1; //Line 8

else //Line 9max = num2; //Line 10

cout << "The maximum number is: " << max << endl; //Line 11

Lines 1 to 6 each have one operation, << or >>. Line 7 has one operation, >¼. Either Line8 or Line 9 executes; each has one operation. There are three operations, <<, in Line 11.Therefore, the total number of operations executed in the preceding code is 6 þ 1 þ 1 þ3 ¼ 11. In this algorithm, the number of operations executed is fixed.

EXAMPLE 18-4

Consider the following algorithm (assume that all variables are properly declared):

cout << "Enter positive integers ending with -1"<< endl; //Line 1

count = 0; //Line 2sum = 0; //Line 3

cin >> num; //Line 4

1234 | Chapter 18: Searching and Sorting Algorithms

Page 13: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

while (num != -1) //Line 5{

sum = sum + num; //Line 6count++; //Line 7cin >> num; //Line 8

}

cout << "The sum of the numbers is: " << sum<< endl; //Line 9

if (count != 0) //Line 10average = sum / count; //Line 11

else //Line 12average = 0; //Line 13

cout << "The average is: " << average << endl; //Line 14

This algorithm has five operations (Lines 1 through 4) before the while loop. Similarly,there are nine or eight operations after the while loop, depending on whether Line 11 orLine 13 executes.

Line 5 has one operation, and there are four operations within the while loop (Lines 6through 8). Thus, Lines 5 through 8 have five operations. If the while loop executes 10times, these five operations execute 10 times, plus one extra operation is executed at Line5 to terminate the loop. Therefore, the number of operations executed from Lines 5through 8 is 51.

If the while loop executes 10 times, the total number of operations executed is:

5� 10þ 1þ 5þ 9 or 5� 10þ 1þ 5þ 8:

That is:

5� 10þ 15 or 5� 10þ 14:

We can generalize it to the case when the while loop executes n times. If the while loopexecutes n times, the number of operations executed is:

5nþ 15 or 5nþ 14:

In these expressions, for very large values of n, the term 5n becomes the dominating term,and the terms 15 and 14 become negligible.

Usually, in an algorithm, certain operations are dominant. For example, in the algorithmin Example 18-4, to add numbers, the dominant operation is in Line 6. Similarly, in asearch algorithm, because the search item is compared with the items in the list, thedominant operations would be comparison, that is, the relational operation. Therefore, inthe case of a search algorithm, we count the number of comparisons.

18

Asymptotic Notation: Big-O Notation | 1235

Page 14: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Suppose that an algorithm performs f(n) basic operations to accomplish a task, in which n isthe size of the problem. Suppose that you want to determine whether an item is in a list andthat the size of the list is n. To determine whether the item is in the list, there are variousalgorithms. However, the basic method is to compare the item with the items in the list.Therefore, the performance of the algorithm depends on the number of comparisons.

Thus, in the case of a search, n is the size of the list and f(n) becomes the count function;that is, f(n) gives the number of comparisons done by the search algorithm. Suppose thaton a particular computer, it takes c units of computer time to execute one operation.Thus, the computer time it would take to execute f (n) operations is cf (n). Clearly, theconstant c depends on the speed of the computer and, therefore, varies from computer tocomputer. However, f (n), the number of basic operations, is the same on each computer.If we know how the function f (n) grows as the size of the problem grows, we candetermine the efficiency of the algorithm. Consider Table 18-4.

Table 18-4 shows how certain functions grow as the parameter n (the problem size)grows. Suppose that the problem size is doubled. From Table 18-4, it follows that if thenumber of basic operations is a function of f (n) ¼ n2, the number of basic operations isquadrupled. If the number of basic operations is a function of f(n) ¼ 2n, then the numberof basic operations is squared. However, if the number of operations is a function off (n) ¼ log2n, the change in the number of basic operations is insignificant.

Suppose that a computer can execute 1 billion steps per second. Table 18-5 shows thetime that the computer takes to execute f(n) steps.

TABLE 18-4 Growth Rate of Various Functions

n log2n nlog2n n2 2n

1 0 0 1 2

2 1 2 2 4

4 2 8 16 16

8 3 24 64 256

16 4 64 256 65536

32 5 160 1024 4294967296

1236 | Chapter 18: Searching and Sorting Algorithms

Page 15: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

In Table 18-5, 1ms ¼ 10-6 seconds and 1ms ¼ 10-3 seconds.

Figure 18-5 shows the growth rate of functions in Table 18-5.

18

TABLE 18-5 Time for f (n) Instructions on a Computer That Executes 1 Billion Instructionsper Second

n f (n) = n f (n) = log2n f (n) = nlog2n f (n) = n2 f (n) = 2n

10 0.01ms 0.003ms 0.033ms 0.1ms 1ms

20 0.02ms 0.004ms 0.086ms 0.4ms 1ms

30 0.03ms 0.005ms 0.147ms 0.9ms 1s

40 0.04ms 0.005ms 0.213ms 1.6ms 18.3min

50 0.05ms 0.006ms 0.282ms 2.5ms 13 days

100 0.10ms 0.007ms 0.664ms 10ms4�1013

years

1000 1.00ms 0.010ms 9.966ms 1ms

10000 10ms 0.013ms 130ms 100ms

100000 0.10ms 0.017ms 1.67ms 10s

1000000 1 ms 0.020ms 19.93ms 16.7m

10000000 0.01s 0.023ms 0.23s 1.16 days

100000000 0.10s 0.027ms 2.66s 115.7 days

Asymptotic Notation: Big-O Notation | 1237

Page 16: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

The remainder of this section develops a notation that shows how a function f (n) grows asn increases without bound. That is, we develop a notation that is useful in describing thebehavior of the algorithm, which gives us the most useful information about the algo-rithm. First, we define the term ‘‘asymptotic.’’

Let f be a function of n. By the term asymptotic, we mean the study of the function f asn becomes larger and larger without bound.

Consider the functions g(n) ¼ n2 and f(n) ¼ n2 + 4n + 20. Clearly, the function g does notcontain any linear term; that is, the coefficient of n in g is zero. Consider Table 18-6.

f (n) = n

f (n) = log2n

f (n) = nlog2n f (n) = n

2

f (n) = 2n

n0

0

2

4

6

8

10

2 4 6 8 10

f (n)

FIGURE 18-5 Growth rate of various functions

TABLE 18-6 Growth Rate of n2 and n2 + 4n + 20

n g(n) = n2 f (n) = n2 + 4n + 20

10 100 160

50 2500 2720

100 10000 10420

1000 1000000 1004020

10000 100000000 100040020

1238 | Chapter 18: Searching and Sorting Algorithms

Page 17: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Clearly, as n becomes larger and larger, the term 4n + 20 in f(n) becomes insignificant,and the term n2 becomes the dominant term. For large values of n, we can predict thebehavior of f(n) by looking at the behavior of g(n). In the algorithm analysis, if thecomplexity of a function can be described by the complexity of a quadratic functionwithout the linear term, we say that the function is of O(n2), called Big-O of n2.

Let f and g be real-valued functions. Assume that f and g are nonnegative; that is, for allreal numbers n, f (n) � 0 and g(n) � 0.

Definition: We say that f(n) is Big-O of g(n), written f(n) ¼ O(g(n)), if there exist positiveconstants c and n0 such that:

f (n) � cg(n) for all n � n0.

EXAMPLE 18-5

Let f (n) ¼ a, wherein a is a nonnegative real number and n � 0. Note that f is a constantfunction.

Now:

f ðnÞ ¼ a � a � 1 for all n � a:

Let c ¼ a, n0 ¼ a, and g(n) ¼ 1. Then, f (n) � cg(n) for all n � n0. It now follows thatf (n) ¼ O(g(n)) ¼ O(1).

From Example 18-5, it follows that if f is a nonnegative constant function, then fis O(1).

EXAMPLE 18-6

Let f (n) ¼ 2n + 5, n � 0. Note that:

f (n) ¼ 2n + 5 � 2n + n ¼ 3n for all n � 5.

Let c ¼ 3, n0 ¼ 5, and g(n) ¼ n. Then, f(n) � cg(n) for all n � 5. It now follows that f(n) ¼O(g(n)) ¼ O(n).

EXAMPLE 18-7

Let f (n) = n2 + 3n + 2, g(n) = n2, n � 0. Note that:

3n + 2 � n2 for all n � 4.

18

Asymptotic Notation: Big-O Notation | 1239

Page 18: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

This implies that:

f (n) ¼ n2+ 3n + 2 � n2+ n2 � 2n2 ¼ 2g(n) for all n � 4.

Let c ¼ 2 and n0 ¼ 4. Then, f (n) � cg(n) for all n � 4. It now follows that f (n) ¼O( g(n)) ¼ O(n2).

In general, we can prove the following theorem. We state the theorem without proof.

Theorem: Let f (n) be a nonnegative real-valued function such that:

f (n) = amnm + am�1nm�1 + � � � +a1n + a0,

in which ais are real numbers, am 6¼ 0, n � 0, and m is a nonnegative integer. Then:

f (n) = O(nm).

In Example 18-8, we use the preceding theorem to establish the Big-O of certain functions.

EXAMPLE 18-8

In the following, f (n) is a nonnegative real-valued function.

EXAMPLE 18-9

Suppose that f(n) ¼ 2log2n + a, in which a is a real number. It can be shown thatf (n) ¼ O( log2n).

Function Big-O

f(n) = an + b, in which a and b are real numbers and a is nonzero f(n) = O(n)

f(n) = n2 + 5n + 1 f(n) = O(n2)

f(n) = 4n6 + 3n3 + 1 f(n) = O(n6)

f(n) = 10n7 + 23 f(n) = O(n7)

f(n) = 6n15 f(n) = O(n15)

1240 | Chapter 18: Searching and Sorting Algorithms

Page 19: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

EXAMPLE 18-10

Consider the following code, in which m and n are int variables and their values arenonnegative.

for (int i = 0; i < m; i++) //Line 1for (int j = 0; j < n; j++) //Line 2

cout << i * j << endl; //Line 3

This code contains nested for loops. The outer for loop, at Line 1, executes m times.For each iteration of the outer loop, the inner loop at Line 2 executes n times. For eachiteration of the inner loop, the output statement in Line 3 executes. It follows that thetotal number of iterations of the nested for loop is mn. So the number of times thestatement in Line 3 executes is mn. It follows that this algorithm is O(mn). Note that ifm ¼ n, then this algorithm is O(n2).

Table 18-7 shows some common Big-O functions that appear in the algorithm analysis.Let f (n) ¼ O(g(n)), wherein n is the problem size.

It can be shown that:

Oð1Þ � Oðlog2nÞ � OðnÞ � Oðnlog2nÞ � Oðn2Þ � Oð2nÞ:

18

TABLE 18-7 Some Big-O Functions That Appear in Algorithm Analysis

Function g (n) Growth rate of f (n)

g(n) = 1The growth rate is constant, so it does not depend on n, the size ofthe problem.

g(n) = log2nThe growth rate is a function of log2n. Because a logarithm functiongrows slowly, the growth rate of the function f is also slow.

g(n) = nThe growth rate is linear. The growth rate of f is directly proportionalto the size of the problem.

g(n) = nlog2n The growth rate is faster than the linear algorithm.

g(n) = n2The growth rate of such functions increases rapidly with the size ofthe problem. The growth rate is quadrupled when the problem size isdoubled.

g(n) = 2n The growth rate is exponential. The growth rate is squared when theproblem size is doubled.

Asymptotic Notation: Big-O Notation | 1241

Page 20: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Using the notations developed in this section, we can conclude that the algorithmin Example 18-3 is of order O(1), and the algorithm in Example 18-4 is of O(n).Table 18-8 summarizes the algorithm analysis of the search algorithms discussed earlier.

Lower Bound on Comparison-Based Search AlgorithmsSequential and binary search algorithms search the list by comparing the target elementwith the list elements. For this reason, these algorithms are called comparison-based

search algorithms. Earlier sections of this chapter showed that a sequential search is ofthe order n, and a binary search is of the order log2n, where n is the size of the list. Theobvious question is: Can we devise a search algorithm that has an order less than log2n?Before we answer this question, first we obtain the lower bound on the number ofcomparisons for the comparison-based search algorithms.

Theorem: Let L be a list of size n > 1. Suppose that the elements of L are sorted. IfSRH(n) denotes the minimum number of comparisons needed, in the worst case, byusing a comparison-based algorithm to recognize whether an element x is in L, thenSRH(n) � log2(n + 1).

Corollary: The binary search algorithm is an optimal worst-case algorithm for solvingsearch problems by the comparison method.

From these results, it follows that if we want to design a search algorithm that is of anorder less than log2n, then it cannot be comparison based.

Sorting AlgorithmsThere are several sorting algorithms in the literature. In this chapter, we discuss some ofthe commonly used sorting algorithms. To compare their performance, we also providesome analysis of these algorithms. These sorting algorithms can be applied to either array-based lists or linked lists. We will specify whether the algorithm being developed is forarray-based lists or linked lists.

Sorting a List: Bubble SortMany sorting algorithms are available in the literature. This section describes using the sortingalgorithm called the bubble sort to sort a list.

TABLE 18-8 Number of Comparisons for a List of Length n

Algorithm Successful Search Unsuccessful Search

Sequential searchn þ 1

2=

1

2n þ 1

2=O(n) n = O(n)

Binary search 2log2n – 3 = O(log2n) 2log2n = O(log2n)

1242 | Chapter 18: Searching and Sorting Algorithms

Page 21: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

Suppose list[0...n - 1] is a list of n elements, indexed 0 to n - 1. We want torearrange, that is, sort, the elements of list in increasing order. The bubble sortalgorithm works as follows.

In a series of n - 1 iterations, the successive elements list[index] and list[index + 1] ofthe list are compared. If list[index] is greater than list[index + 1], then the elementslist[index] and list[index + 1] are swapped.

It follows that the smaller elements move toward the top, and the larger elements movetoward the bottom.

In the first iteration, we consider the list[0...n - 1]. As you will see after the firstiteration, the largest element of the list is moved to the last position, which is positionn – 1, in the list. In the second iteration, we consider the list[0...n - 2]. After thesecond iteration, the second largest element in the list is moved to the position n – 2,which is second to the last position in the list. In the third iteration, we consider thelist[0...n - 3], and so on. As you will see, after each iteration, the size of theunsorted portion of the list shrinks.

Consider the list[0...4] of five elements, as shown in Figure 18-6.

Iteration 1: Sort list[0...4]. Figure 18-7 shows how the elements oflist get rearranged in the first iteration.

list[0]

list

list[1]

list[2]

list[3]

list[4]

10

7

19

5

16

FIGURE 18-6 List of five elements

compareand

swap compareunsorted

list

10

7

19

5

16

7

10

19

5

16

7

10

19

5

16

7

10

5

19

16

7

10

5

16

19

compareand

swapcompare

andswap

FIGURE 18-7 Elements of list during the first iteration

Sorting a List: Bubble Sort | 1243

Page 22: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Notice that in the first diagram of Figure 18-7, list[0] >

list[1]. Therefore, list[0] and list[1] are swapped. Inthe second diagram, list[1] and list[2] are compared.Because list[1] < list[2], they do not get swapped. Thethird diagram of Figure 18-7 compares list[2] with list[3];because list[2] > list[3], list[2] is swapped withlist[3]. Then, in the fourth diagram, we compare list[3]

with list[4]. Because list[3] > list[4], list[3] andlist[4] are swapped.

After the first iteration, the largest element is at the last position.Therefore, in the next iteration, we consider the list[0...3].

Iteration 2: Sort list[0...3]. Figure 18-8 shows how the elements oflist get rearranged in the second iteration.

The elements are compared and swapped as in the first iteration.Here, only the list elements list[0] through list[3] areconsidered. After the second iteration, the last two elementsare in the right place. Therefore, in the next iteration, weconsider list[0...2].

Iteration 3: Sort list[0...2]. Figure 18-9 shows how the elements oflist get rearranged in the third iteration.

compare

compare

compareand

swapunsorted

list

7

10

5

16

19

7

10

5

16

19

7

5

10

16

19

7

5

10

16

19

FIGURE 18-8 Elements of list during the second iteration

compare

compareand

swapunsorted

list

7

5

10

16

19

5

7

10

16

19

5

7

10

16

19

FIGURE 18-9 Elements of list during the third iteration

1244 | Chapter 18: Searching and Sorting Algorithms

Page 23: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

After the third iteration, the last three elements are in the rightplace. Therefore, in the next iteration, we consider list[0...1].

Iteration 4: Sort list[0...1]. Figure 18-10 shows how the elements oflist get rearranged in the fourth iteration.

After the fourth iteration, list is sorted.

The following C++ function implements the bubble sort algorithm:

template <class elemType>void bubbleSort(elemType list[], int length){

for (int iteration = 1; iteration < length; iteration++){

for (int index = 0; index < length - iteration;index++)

{if (list[index] > list[index + 1]){

elemType temp = list[index];list[index] = list[index + 1];list[index + 1] = temp;

}}

}} //end bubbleSort

Example 18-11 illustrates how to use the bubble sort algorithm in a program.

EXAMPLE 18-11 (BUBBLE SORT)

#include <iostream>#include "searchSortAlgorithms.h"

using namespace std;

template <class elemType>void print(elemType list[], int length);

compareunsorted

list5

7

10

16

19

5

7

10

16

19

FIGURE 18-10 Elements of list during the fourth iteration

Sorting a List: Bubble Sort | 1245

Page 24: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

int main(){

int intList[] = {2, 56, 34, 25, 73,46, 89, 10, 5, 16}; //Line 1

cout << "Line 2: Before sorting, intList: "; //Line 2

print(intList, 10); //Line 3

cout << endl; //Line 4

bubbleSort(intList, 10); //Line 5

cout << "Line 6: After sorting, intList: "; //Line 6

print(intList, 10); //Line 7

return 0;}

template <class elemType>void print(elemType list[], int length){

for (int i = 0; i < length; i++)cout << list[i] << " ";

cout << endl;}

Sample Run:

Line 2: Before sorting, intList: 2 56 34 25 73 46 89 10 5 16

Line 6: After sorting, intList: 2 5 10 16 25 34 46 56 73 89

The statement in Line 1 declares and initializes intList to be an array of 10 componentsof type int. The statement in Line 3 outputs the values of the array intList beforesorting this array. The statement in Line 5 uses the function bubbleSort to sort list.Notice that both intList and its length (the number of elements) are passed asparameters to the function bubbleSort. The statement in Line 7 outputs the sortedintList.

Analysis: Bubble SortIn the case of search algorithms, our only concern was with the number of key (item)comparisons. A sorting algorithm makes key comparisons and also moves the data.Therefore, in analyzing the sorting algorithm, we look at the number of key comparisonsas well as the number of data movements.

1246 | Chapter 18: Searching and Sorting Algorithms

Page 25: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Suppose a list L of length n is to be sorted using bubble sort. Consider the functionbubbleSort as given in this chapter. This function contains nested for loops. BecauseL is of length n, the outer loop executes n – 1 times. For each iteration of the outer loop,the inner loop executes a certain number of times. Let us consider the first iteration of theouter loop. During the first iteration of the outer loop, the number of iterations ofthe inner loop is n – 1. So there are n – 1 comparisons. Similarly, during the seconditeration of the outer loop, the number of iterations of the inner loop is n – 2, and so on.Thus, the total number of comparisons is:

ðn� 1Þ þ ðn� 2Þ þ � � � þ 2þ 1 ¼ nðn� 1Þ2

¼ 1

2n2 � 1

2n ¼ Oðn2Þ:

In the worst case, the body of the if statement always executes. So in the worst case, thenumber of assignments is:

3nðn� 1Þ

2¼ 3

2n2 � 3

2n ¼ Oðn2Þ:

If the list is already sorted, which is the best case, the number of assignments is 0. It can be

shown that, on average, bubble sort makes aboutnðn� 1Þ

4 item assignments. However, the

number of comparisons for the bubble sort, as given in this chapter, is alwaysnðn� 1Þ

2 .

Therefore, to sort a list of size 1000, bubble sort makes about 500,000 key comparisonsand about 250,000 item assignments. The next section presents the selection sort algo-rithm that reduces the number of item assignments.

Exercise 7 at the end of this chapter gives a version of the bubble sort algorithm in which

the number of comparisons in the best case is O (n).

Bubble Sort Algorithm and the classunorderedArrayListTypeThe class unorderedArrayListType, designed in Chapter 13, does not contain anysorting algorithm. Now that you know how to implement the bubble sort algorithm, youcan learn how to use it in the class unorderedArrayListType.

To use the binary search algorithm within the class unorderedArrayListType, weadd the function sort to this class and call the functions bubbleSort with the appro-priate parameters. (Note that we have also added the function to use the binary searchalgorithm.)

template <class elemType>class unorderedArrayListType: public arrayListType<elemType>

18

Sorting a List: Bubble Sort | 1247

Page 26: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

{public:

void insertAt(int location, const elemType& insertItem);void insertEnd(const elemType& insertItem);void replaceAt(int location, const elemType& repItem);int seqSearch(const elemType& searchItem) const;void remove(const elemType& removeItem);

void sort();int binSearch(const elemType& item) const;

unorderedArrayListType(int size = 100);//Constructor

};

The definitions of the member functions binSearch and sort are:

template <class elemType>int unorderedArrayListType<elemType>::

binSearch(const elemType& item) const{

return binarySearch(list, length, item);}

template <class elemType>void unorderedArrayListType<elemType>::sort(){

selectionSort(list, length);}

We leave it as an exercise for you to write a program to test the member functions sortand binSearch.

Selection Sort: Array-Based ListsChapter 9 described the selection sort algorithm for array-based lists. However, theselection sort algorithm given in Chapter 9 works only for arrays of type int. In thissection, using templates we give a generic selection sort algorithm. Note that thealgorithm given here is slightly different than the one given in Chapter 8.

Suppose that list is the array to be sorted and length denotes the length, that is, thenumber of elements in list. As described in Chapter 8, a selection sort involves thefollowing steps:

a. Find the location of the smallest element.

b. Move the smallest element to the beginning of the unsorted list.

Given the starting index, first, and the ending index, last, of the list, the followingC++ function returns the index of the smallest element in list[first]...

list[last].

1248 | Chapter 18: Searching and Sorting Algorithms

Page 27: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

template <class elemType>int minLocation(elemType list[], int first, int last){

int loc, minIndex;

minIndex = first;for (loc = first + 1; loc <= last; loc++)

if (list[loc] < list[minIndex])minIndex = loc;

return minIndex;} //end minLocation

Given the locations in the list of the elements to be swapped, the following C++function, swap, swaps those elements:

template <class elemType>void swap(elemType list[], int first, int second){

elemType temp;

temp = list[first];list[first] = list[second];list[second] = temp;

} //end swap

We can now complete the definition of the function selectionSort:

template <class elemType>void selectionSort(elemType list[], int length){

int loc, minIndex;

for (loc = 0; loc < length; loc++){

minIndex = minLocation(list, loc, length - 1);swap(list, loc, minIndex);

}} //end selectionSort

We leave it as an exercise for you to write a program to test the selection sort algorithm.(See Programming Exercise 6 at the end of this chapter.)

1. A selection sort can also be implemented by selecting the largest element in the unsorted

portion of the list and moving it to the bottom of the list. You can easily implement this

form of selection sort by altering the if statement in the function minLocation and

passing the appropriate parameters to both the corresponding function and the function

swap (when these functions are called in the function selectionSort).

2. A selection sort can also be applied to linked lists. The general algorithm is the same,

and the details are left as an exercise for you. See Programming Exercise 7 at the

end of this chapter.

Selection Sort: Array-Based Lists | 1249

Page 28: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Analysis: Selection SortSuppose that a list L of length n is to be sorted using the selection sort algorithm. Thefunction swap does three item assignments and is executed n � 1 times. Hence, thenumber of item assignments is 3(n � 1) ¼ O(n).

The key comparisons are made by the function minLocation. For a list of length k, thefunction minLocation makes k � 1 key comparisons. Also, the function minLocation

is executed n � 1 times (by the function selectionSort). The first time, the functionminLocation finds the index of the smallest key item in the entire list and, therefore,makes n � 1 comparisons. The second time, the function minLocation finds the indexof the smallest element in the sublist of length n � 1 and so makes n � 2 comparisons, andso on. Hence, the number of key comparisons is as follows:

ðn� 1Þ þ ðn� 2Þ þ � � � þ 2þ 1 ¼ nðn� 1Þ2

¼ 1

2n2 � 1

2n

¼ 1

2n2 þOðnÞ

¼ Oðn2Þ:

It thus follows that if n ¼ 1000, the number of key comparisons the selection sortalgorithm makes is:

1

2ð1000Þ2 � 1

2ð1000Þ ¼ 499500 � 500000:

Note that the selection sort algorithm does not depend on the initial arrangement of thedata. The number of comparisons is always O(n2) and the number of assignments is O(n).In general, this algorithm is good only for small lists because O(n2) grows rapidly as ngrows. However, if data movement is expensive and the number of comparisons is not,then this algorithm could be a better choice over other algorithms.

Insertion Sort: Array-Based ListsThe previous section described and analyzed the selection sort algorithm. It was shownthat if n ¼ 1000, the number of key comparisons is approximately 500,000, which is quitehigh. This section describes the sorting algorithm called the insertion sort, which tries toimprove—that is, reduce—the number of key comparisons.

The insertion sort algorithm sorts the list by moving each element to its proper place inthe sorted portion of the list. Consider the list given in Figure 18-11.

1250 | Chapter 18: Searching and Sorting Algorithms

Page 29: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

The length of the list is 8. In this list, the elements list[0], list[1], list[2], andlist[3] are in order. That is, list[0]...list[3] is sorted (see Figure 18-12).

Next, we consider the element list[4], the first element of the unsorted list. Becauselist[4] < list[3], we need to move the element list[4] to its proper location. Itthus follows that element list[4] should be moved to list[2] (see Figure 18-13).

To move list[4] into list[2], first we copy list[4] into temp, a temporarymemory space (see Figure 18-14).

18

list

[0]

10 18 25 30 23 17 45 35

[1] [2] [3] [4] [5] [6] [7]

FIGURE 18-11 list

list

[0]

10 18 25 30 23 17 45 35

[1] [2] [3] [4] [5] [6] [7]

sorted list unsorted list

FIGURE 18-12 Sorted and unsorted portion of list

list

[0]

10 18 25 30 23 17 45 35

[1] [2] [3] [4] [5] [6] [7]

sorted list unsorted list

move

FIGURE 18-13 Move list[4] into list[2]

Insertion Sort: Array-Based Lists | 1251

Page 30: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Next, we copy list[3] into list[4] and then list[2] into list[3] (see Figure 18-15).

After copying list[3] into list[4] and list[2] into list[3], the list is as shown inFigure 18-16.

list

temp

[0]

10 18

23

25 3025 17 45 35

[1]

sorted list unsorted list

[2] [3] [4] [5] [6] [7]

FIGURE 18-16 List after copying list[3] into list[4] and then list[2] into list[3]

list

[0]

10 18 25 30 23 17 45 35

[1]

sorted list unsorted list

[2] [3] [4] [5] [6] [7]

temp 23

copy copy

FIGURE 18-15 List before copying list[3] into list[4] and then list[2] into list[3]

list

temp

[0]

10 18

23

30 23

copy

25 17 45 35

[1]

sorted list unsorted list

[2] [3] [4] [5] [6] [7]

FIGURE 18-14 Copy list[4] into temp

1252 | Chapter 18: Searching and Sorting Algorithms

Page 31: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

We now copy temp into list[2]. Figure 18-17 shows the resulting list.

Now list[0]...list[4] is sorted, and list[5]...list[7] is unsorted. We repeatthis process on the resulting list by moving the first element of the unsorted list into thesorted list in the proper place.

From this discussion, we see that during the sorting phase, the array containing the list isdivided into two sublists: sorted and unsorted. Elements in the sorted sublist are in order;elements in the unsorted sublist are to be moved one at a time to their proper placesin the sorted sublist. We use an index—say, firstOutOfOrder—to point to thefirst element in the unsorted sublist; that is, firstOutOfOrder gives the index of thefirst element in the unsorted portion of the array. Initially, firstOutOfOrder isinitialized to 1.

This discussion translates into the following pseudocode algorithm:

for (firstOutOfOrder = 1; firstOutOfOrder < length; firstOutOfOrder++)if (list[firstOutOfOrder] is less than list[firstOutOfOrder – 1]){

copy list[firstOutOfOrder] into temp

initialize location to firstOutOfOrder

do{

a. copy list[location – 1] into list[location]b. decrement location by 1 to consider the next element

of the sorted portion of the array}while (location > 0 && the list element at location - 1 is

greater than temp)}

copy temp into list[location]

18

list

temp

[0]

10 18

23

25 30

copy

23 17 45 35

[1]

sortedlist

unsortedlist

[2] [3] [4] [5] [6] [7]

FIGURE 18-17 List after copying temp into list[2]

Insertion Sort: Array-Based Lists | 1253

Page 32: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

The following C++ function implements the previous algorithm:

template <class elemType>void insertionSort(elemType list[], int length){

for (int firstOutOfOrder = 1; firstOutOfOrder < length;firstOutOfOrder++)

if (list[firstOutOfOrder] < list[firstOutOfOrder - 1]){

elemType temp = list[firstOutOfOrder];int location = firstOutOfOrder;

do{

list[location] = list[location - 1];location--;

}while (location > 0 && list[location - 1] > temp);

list[location] = temp;}

} //end insertionSort

We leave it as an exercise for you to write a program to test the insertion sort algorithm.(See Programming Exercise 8 at the end of this chapter.)

An insertion sort can also be applied to linked lists. The general algorithm is the same,

and the details are left as an exercise for you. See Programming Exercise 9 at the end of

this chapter.

Analysis: Insertion SortLet L be a list of length n. Suppose L is to be sorted using insertion sort. The for loopexecutes n � 1 times. In the best case, when the list is already sorted, for each iteration ofthe for loop, the if statement evaluates to false, so there are n � 1 key comparisons.Thus, in the best case, the number of key comparisons is n – 1 ¼ O(n). Let us consider theworst case. In this case, for each iteration of the for loop, the if statement evaluates totrue. Moreover, in the worst case, for each iteration of the for loop, the do. . .while loopexecutes firstOutOfOrder - 1 times. It follows that in the worst case, the number of keycomparisons is:

1þ 2þ � � � þ ðn� 1Þ ¼ nðn� 1Þ=2 ¼ Oðn2Þ:

It can be shown that the average number of key comparisons and the average number ofitem assignments in an insertion sort algorithm are:

1

4n2 þOðnÞ ¼ Oðn2Þ:

1254 | Chapter 18: Searching and Sorting Algorithms

Page 33: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Table 18-9 summarizes the behavior of the bubble sort, selection sort, and insertion sortalgorithms.

Lower Bound on Comparison-Based SortAlgorithmsIn the previous sections, we discussed the selection and insertion sort algorithms andnoted that the average-case behavior of these algorithms is O(n2). Both of these algo-rithms are comparison based; that is, the lists are sorted by comparing their respectivekeys. Before discussing any additional sorting algorithms, let us discuss the best-casescenario for comparison-based sorting algorithms.

We can trace the execution of a comparison-based algorithm by using a graph called acomparison tree. Let L be a list of n distinct elements, wherein n > 0. For any j and k,wherein 1 � j � n and 1 � k � n, either L[ j] < L[k] or L[ j] > L[k]. Because eachcomparison of the keys has two outcomes, the comparison tree is a binary tree. Whiledrawing this figure, we draw each comparison as a circle called a node. The node is labeledas j:k, representing the comparison of L[ j] with L[k]. If L[ j] < L[k], follow the left branch;otherwise, follow the right branch. Figure 18-18 shows the comparison tree for a listof length 3. (In Figure 18-18, the rectangle, called a leaf, represents the final ordering ofthe nodes.)

18

TABLE 18-9 Average Case Behavior of the Bubble Sort, Selection Sort, and Insertion SortAlgorithms for a List of Length n

Algorithm Number of Comparisons Number of Swaps

Bubble sortnðn � 1Þ

2= O(n2)

nðn � 1Þ4

= O(n2)

Selection sortnðn � 1Þ

2= O(n2) 3(n � 1) =O(n)

Insertion sort1

4n2 þ O(n) = O(n2)

1

4n2 þ O(n) = O(n2)

Lower Bound on Comparison-Based Sort Algorithms | 1255

Page 34: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

We call the top node in the figure the root node. The straight line that connects the twonodes is called a branch. A sequence of branches from a node, x, to another node, y, iscalled a path from x to y.

Associated with each path from the root to a leaf is a unique permutation of the elementsof L. This uniqueness follows because the sort algorithm only moves the data and makescomparisons. Furthermore, the data movement on any path from the root to a leaf is thesame regardless of the initial inputs. For a list of n elements, n > 0, there are n! differentpermutations. Any one of these n! permutations might be the correct ordering of L. Thus,the comparison tree must have at least n! leaves.

Now let us consider the worst case for all comparison-based sorting algorithms. We statethe following result without proof.

Theorem: Let L be a list of n distinct elements. Any sorting algorithm that sorts L bycomparison of the keys only, in its worst case, makes at least O(nlog2n) key comparisons.

As analyzed in the previous sections, both the selection and insertion sort algorithms areof the order O(n2). The remainder of this chapter discusses sorting algorithms that, onaverage, are of the order O(nlog2n).

Quick Sort: Array-Based ListsIn the previous section, we noted that the lower bound on comparison-based algorithms isO(nlog2n). The sorting algorithms bubble sort, selection sort, and insertion sort, discussed earlierin this chapter, are of the order O(n2). In this and the next two sections, we discuss sortingalgorithms that are of the order O(nlog2n). The first algorithm is the quick sort algorithm.

1:2

2:3 2:3

1:3 1:31,2,3

1,3,2 3,1,2 2,1,3 2,3,1

3,2,1

L[1] < L[2]

L[2] < L[3] L[2] > L[3]

L[1] > L[2]

L[1] < L[3] L[1] < L[3]L[1] > L[3]

L[1] > L[3]

L[2]<L[3] L[2]>L[3]

FIGURE 18-18 Comparison tree for sorting three items

1256 | Chapter 18: Searching and Sorting Algorithms

Page 35: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

The quick sort algorithm uses the divide-and-conquer technique to sort a list. The list ispartitioned into two sublists, which are then sorted and combined into one list in such away so that the combined list is sorted. Thus, the general algorithm is:

if (the list size is greater than 1){

a. Partition the list into two sublists, say lowerSublist andupperSublist.

b. Quick sort lowerSublist.c. Quick sort upperSublist.d. Combine the sorted lowerSublist and sorted upperSublist.

}

After partitioning the list into two sublists called lowerSublist and upperSublist, thesublists are sorted using the quick sort algorithm. In other words, we use recursion toimplement the quick sort algorithm.

The quick sort algorithm described here is for array-based lists. The algorithm for linkedlists can be developed in a similar manner and is left as an exercise for you.

In the quick sort algorithm, the list is partitioned in such way that combining thesorted lowerSublist and upperSublist is trivial. Therefore, in a quick sort, all ofthe sorting work is done in partitioning the list. Because all of the sorting workoccurs during the partitioning of the list, we first describe the partition procedure indetail.

To partition the list into two sublists, first we choose an element of the list calledpivot. The pivot is used to divide the list into two sublists: lowerSublist andupperSublist. The elements in lowerSublist are smaller than pivot, and theelements in upperSublist are greater than or equal to pivot. For example, considerthe list in Figure 18-19.

There are several ways to determine pivot. However, pivot is chosen so that, it ishoped, lowerSublist and upperSublist are of nearly equal size. For illustrationpurposes, let us choose the middle element of the list as pivot. The partition procedurethat we describe partitions this list using pivot as the middle element, in our case 50, asshown in Figure 18-20.

18

list

[0]

45 82 25 94 50 60 78 32

[1] [2] [3] [4] [5] [6] [7]

92

[8]

FIGURE 18-19 list before the partition

Quick Sort: Array-Based Lists | 1257

Page 36: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

From Figure 18-20, it follows that after partitioning list into lowerSublist andupperSublist, pivot is in the right place. Thus, after sorting lowerSublist andupperSublist, combining the two sorted sublists is trivial.

The partition algorithm is as follows (we assume that pivot is chosen as the middleelement of the list).

1. Determine pivot, and swap pivot with the first element ofthe list.

Suppose that the index smallIndex points to the last element less thanpivot. The index smallIndex is initialized to the first element of the list.

2. For the remaining elements in the list (starting at the second element):

If the current element is less than pivot,

a. Increment smallIndex.

b. Swap the current element with the array element pointed to bysmallIndex.

3. Swap the first element, that is, pivot, with the array element pointed toby smallIndex.

Step 2 can be implemented using a for loop, with the loop starting at the second elementof the list.

Step 1 determines the pivot and moves pivot to the first array position. During theexecution of Step 2, the list elements get arranged as shown in Figure 18-21. (Supposethe name of the array containing the list elements is list.)

lowerSublist upperSublist

list

[0]

32 25 45 50 82 60 78 94 92

[1] [2] [3] [4] [5] [6] [7] [8]

FIGURE 18-20 list after the partition

< pivot pivot >= pivot

smallIndex index

lowersublist

uppersublist

elements to bemoved in asublist

FIGURE 18-21 List during the execution of Step 2

1258 | Chapter 18: Searching and Sorting Algorithms

Page 37: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

As shown in Figure 18-21, pivot is in the first array position. Elements in the lower sublistare less than pivot; elements in the upper sublist are greater than or equal to pivot. Thevariable smallIndex contains the index of the last element of the lower sublist; the variableindex contains the index of the next element that needs to be moved, either in the lowersublist or in the upper sublist. As explained in Step 2, if the next element of the list (that is,list[index]) is less than pivot, we advance smallIndex to the next array position andswap list[index] with list[smallIndex]. Next, we illustrate Step 2.

Suppose that the list is as given in Figure 18-22.

Step 1 requires us to determine the pivot and swap it with the first array element. Forthe list in Figure 18-22, the middle element is at the position (0 + 13) / 2 = 6. That is,pivot is at position 6. Therefore, after swapping pivot with the first array element, thelist is as shown in Figure 18-23. (Notice that in Figure 18-23, 52 is swapped with 32.)

Suppose that after executing Step 2 a few times, the list is as shown in Figure 18-24.

18

1352

pivot

32 48 22 96 87 55 78 11 58 66 88 45

smallIndex index

lowersublist

uppersublist

FIGURE 18-24 List after a few iterations of Step 2

[1]

55

[0]

32 87 13 78 96 52 48 22

[2] [3] [4] [5] [6] [7] [8]

11 58 66 88 45

[9] [10] [11] [12] [13]

FIGURE 18-22 List before sorting

[1]

55

[0]

52

pivot

87 13 78 96 32 48 22

[2] [3] [4] [5] [6] [7] [8]

11 58 66 88 45

[9] [10] [11] [12] [13]

FIGURE 18-23 List after moving pivot to the first array position

Quick Sort: Array-Based Lists | 1259

Page 38: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

As shown in Figure 18-24, the next element of the list that needs to be moved into asublist is indicated by index. Because list[index] < pivot, we need to move theelement list[index] into the lower sublist. To do so, we first advance smallIndex tothe next array position and then swap list[smallIndex] with list[index]. Theresulting list is as shown in Figure 18-25. (Notice that 11 is swapped with 96.)

Now consider the list in Figure 18-26.

For the list in Figure 18-26, list[index] is 58, which is greater than pivot. Therefore,list[index] is to be moved into the upper sublist. This is accomplished by leaving 58 atits position and increasing the size of the upper sublist by one, to the next array position.After moving 58 into the upper sublist, the list is as shown in Figure 18-27.

1352

pivot

32 48 22 11 87 55 78 96 58 66 88 45

smallIndex index

lower sublist upper sublist

FIGURE 18-27 List after moving 58 into the upper sublist

1352

pivot

32 48 22 11 87 55 78 96 58 66 88 45

smallIndex index

lower sublist upper sublist

FIGURE 18-25 List after moving 11 into the lower sublist

1352

pivot

32 48 22 11 87 55 78 96 58 66 88 45

smallIndex index

lower sublist upper sublist

FIGURE 18-26 List before moving 58 into a sublist

1260 | Chapter 18: Searching and Sorting Algorithms

Page 39: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

After moving the elements that are less than pivot into the lower sublist and elements thatare greater than pivot into the upper sublist (that is, after completely executing Step 2), theresulting list is as shown in Figure 18-28.

Next, we execute Step 3 and move 52, pivot, to the proper position in the list.This is accomplished by swapping 52 with 45. The resulting list is as shown inFigure 18-29.

As shown in Figure 18-29, Steps 1, 2, and 3 in the preceding algorithm partition the listinto two sublists. The elements less than pivot are in the lower sublist; the elementsgreater than or equal to pivot are in the upper sublist.

To partition the list into the lower and upper sublists, we need to keep track of only thelast element of the lower sublist and the next element of the list that needs to be movedinto either the lower sublist or the upper sublist. In fact, the upper sublist is between thetwo indices smallIndex and index.

We now write the function, partition, to implement the preceding partition algo-rithm. After rearranging the elements of the list, the function partition returns thelocation of pivot so that we can determine the starting and ending locations of thesublists. The definition of the function partition is:

18

1345 32 48 22 11 52 55 78 96 58 66 88 87

pivot

lower sublist upper sublist

FIGURE 18-29 List after swapping 52 with 45

1352

pivot

32 48 22 11 45 55 78 96 58 66 88 87

smallIndex

lower sublist upper sublist

FIGURE 18-28 List elements after arranging into the lower sublist and upper sublist

Quick Sort: Array-Based Lists | 1261

Page 40: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

template <class elemType>int partition(elemType list[], int first, int last){

elemType pivot;

int index, smallIndex;

swap(list, first, (first + last) / 2);

pivot = list[first];smallIndex = first;

for (index = first + 1; index <= last; index++)if (list[index] < pivot){

smallIndex++;swap(list, smallIndex, index);

}

swap(list, first, smallIndex);

return smallIndex;} //end partition

Note that the formal parameters first and last specify the starting and endingindices, respectively, of the sublist of the list to be partitioned. If first = 0 andlast ¼ length – 1, the entire list is partitioned.

As you can see from the definition of the function partition, certain elements of the listneed to be swapped. The following function, swap, accomplishes this task. (Notice thatthis swap function is the same as the one given earlier in this chapter for the selection sortalgorithm.)

template <class elemType>void swap(elemType list[], int first, int second){

elemType temp;

temp = list[first];list[first] = list[second];list[second] = temp;

} //end swap

Once the list is partitioned into lowerSublist and upperSublist, we again apply thequick sort function to sort the two sublists. Because both sublists are sorted using thesame quick sort algorithm, the easiest way to implement this algorithm is to use recur-sion. Therefore, this section gives the recursive version of the quick sort algorithm. Asexplained previously, after rearranging the elements of the list, the function partition

returns the index of pivot so that the starting and ending indices of the sublists can bedetermined.

1262 | Chapter 18: Searching and Sorting Algorithms

Page 41: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Given the starting and ending indices of a list, the following function, recQuickSort,implements the recursive version of the quick sort algorithm:

template <class elemType>void recQuickSort(elemType list[], int first, int last){

int pivotLocation;

if (first < last){

pivotLocation = partition(list, first, last);recQuickSort(list, first, pivotLocation - 1);recQuickSort(list, pivotLocation + 1, last);

}} //end recQuickSort

Finally, we write the quick sort function, quickSort, that calls the functionrecQuickSort on the original list:

template <class elemType>void quickSort(elemType list[], int length){

recQuickSort(list, 0, length - 1);} //end quickSort

We leave it as an exercise for you to write a program to test the quick sort algorithm. SeeProgramming Exercise 10 at the end of this chapter.

Analysis: Quick SortThe general analysis of the quick sort algorithm is beyond the scope of this book.However, let us determine the number of comparisons in the worst case. Supposethat L is a list of n elements, n � 0. In a quick sort, all of the sorting work is done bythe function partition. From the definition of the function partition, it followsthat to partition a list of length k, the function partition makes k – 1 keycomparisons. Also, in the worst case, after partition, one sublist is of length k – 1,and the other sublist is of length 0.

It follows that in the worst case, the first call of the function partition makes n – 1key comparisons. In the second call, the function partition partitions a list of lengthn – 1, so it makes n – 2 key comparisons, and so on. We can now conclude that to sort alist of length n, in the worst case, the total number of key comparisons made by a quicksort is:

ðn� 1Þ þ ðn� 2Þ þ � � � þ 2þ 1 ¼ nðn� 1Þ=2 ¼ Oðn2Þ:

Table 18-10 summarizes the behavior of the quick sort algorithm for a list oflength n.

18

Quick Sort: Array-Based Lists | 1263

Page 42: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Merge Sort: Linked List-Based ListsIn the previous section, we described the quick sort algorithm and stated that the average-case behavior of a quick sort is O(nlog2n). However, the worst-case behavior of a quicksort is O(n2). This section describes the sorting algorithm whose behavior is alwaysO(nlog2n).

Like the quick sort algorithm, the merge sort algorithm uses the divide-and-conquertechnique to sort a list. A merge sort algorithm also partitions the list into two sublists,sorts the sublists, and then combines the sorted sublists into one sorted list. This sectiondescribes the merge sort algorithm for linked list-based lists. We leave it for you todevelop the merge sort algorithm for array-based lists, which can be done by using thetechniques described for linked lists.

The merge sort and the quick sort algorithms differ in how they partition the list. Asdiscussed earlier, a quick sort first selects an element in the list, called pivot, and thenpartitions the list so that the elements in one sublist are less than pivot and the elementsin the other sublist are greater than or equal to pivot. By contrast, a merge sort dividesthe list into two sublists of nearly equal size. For example, consider the list whoseelements are as follows:

list: 35 28 18 45 62 48 30 38

The merge sort algorithm partitions this list into two sublists as follows:

first sublist: 35 28 18 45second sublist: 62 48 30 38

The two sublists are sorted using the same algorithm (that is, a merge sort) used on theoriginal list. Suppose that we have sorted the two sublists. That is, suppose that the listsare now as follows:

first sublist: 18 28 35 45second sublist: 30 38 48 62

Next, the merge sort algorithm combines, that is, merges, the two sorted sublists into onesorted list.

Figure 18-30 further illustrates the merge sort process.

TABLE 18-10 Analysis of the Quick Sort Algorithm for a List of Length n

Number of Comparisons Number of Swaps

Average case (1.39)nlog2 n þ O(n) = O(nlog2 n) (0.69)nlog2 n þ O(n) = O(nlog2 n)

Worst casen2

2� n

2= O(n2)

n2

2þ 3n

2�2 = O(n2)

1264 | Chapter 18: Searching and Sorting Algorithms

Page 43: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

From Figure 18-30, it is clear that in the merge sort algorithm, most of the sorting work isdone in merging the sorted sublists.

The general algorithm for the merge sort is as follows:

if the list is of a size greater than 1{

a. Divide the list into two sublists.b. Merge sort the first sublist.c. Merge sort the second sublist.d. Merge the first sublist and the second sublist.

}

As remarked previously, after dividing the list into two sublists—the first sublist and thesecond sublist—the two sublists are sorted using the merge sort algorithm. In otherwords, we use recursion to implement the merge sort algorithm.

18

35 28 18 45 62 48 30 38

divide

35 28 18 45 62 48 30 38

divide

35 28 18 45

divide

62 48 30 38

divide

35 28

divide

18 45

divide

62 48

divide

30 38

merge

28 35

merge

18 45

merge

48 62

merge

30 38

merge

18 28 35 45

merge

30 38 48 62

merge

18 28 30 35 38 45 48 62

FIGURE 18-30 Merge sort algorithm

Merge Sort: Linked List-Based Lists | 1265

Page 44: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

We next describe the necessary algorithm to:

• Divide the list into two sublists of nearly equal size.

• Merge sort both sublists.

• Merge the sorted sublists.

DivideBecause data is stored in a linked list, we do not know the length of the list. Furthermore,a linked list is not a random access data structure. Therefore, to divide the list into twosublists, we need to find the middle node of the list.

Consider the list in Figure 18-31.

To find the middle of the list, we traverse the list with two pointers—say, middle andcurrent. The pointer middle is initialized to the first node of the list. Because this listhas more than two nodes, we initialize current to the third node. (Recall that we sortthe list only if it has more than one element because a list of size 1 is already sorted. Also,if the list has only two nodes, we set current to NULL.) Consider the list shown in Figure18-32.

Every time we advance middle by one node, we advance current by one node.After advancing current by one node, if current is not NULL, we again advancecurrent by one node. That is, for the most part, every time middle advances by onenode, current advances by two nodes. Eventually, current becomes NULLand middle points to the last node of the first sublist. For example, for the list inFigure 18-32, when current becomes NULL, middle points to the node with info 25

(see Figure 18-33).

head

middle current

65 18 85 95 25 20 45 75 30

FIGURE 18-32 middle and current before traversing the list

head

65 18 85 95 25 20 45 75 30

FIGURE 18-31 Unsorted linked list

1266 | Chapter 18: Searching and Sorting Algorithms

Page 45: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

It is now easy to divide the list into two sublists. First, using the link of middle, we assigna pointer to the node following middle. Then, we set the link of middle to NULL.Figure 18-34 shows the resulting sublists.

This discussion translates into the following C++ function, divideList:

template <class Type>void unorderedLinkedList<Type>::

divideList(nodeType<Type>* first1,nodeType<Type>* &first2)

{nodeType<Type>* middle;nodeType<Type>* current;

if (first1 == NULL) //list is emptyfirst2 = NULL;

else if (first1->link == NULL) //list has only one nodefirst2 = NULL;

else{

middle = first1;current = first1->link;

if (current != NULL) //list has more than two nodescurrent = current->link;

while (current != NULL)

18

head

middle

65 18 85 95

otherhead

25

20 45 75 30

FIGURE 18-34 List after dividing it into two lists

head

middle

65 18 85 95 25 20 45 75 30

FIGURE 18-33 middle after traversing the list

Merge Sort: Linked List-Based Lists | 1267

Page 46: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

{middle = middle->link;current = current->link;if (current != NULL)

current = current->link;} //end while

first2 = middle->link; //first2 points to the first//node of the second sublist

middle->link = NULL; //set the link of the last node//of the first sublist to NULL

} //end else} //end divideList

Now that we know how to divide a list into two sublists of nearly equal size, next wefocus on merging the sorted sublists. Recall that in a merge sort, most of the sorting workis done in merging the sorted sublists.

MergeOnce the sublists are sorted, the next step in the merge sort algorithm is to merge thesorted sublists. Sorted sublists are merged into a sorted list by comparing the elements ofthe sublists and then adjusting the pointers of the nodes with the smaller info. Let usillustrate this procedure on the sublists shown in Figure 18-35. Suppose that first1points to the first node of the first sublist, and first2 points to the first node of thesecond sublist.

We first compare the info of the first node of each sublist to determine the first node ofthe merged list. We set newHead to point to the first node of the merged list. We also usethe pointer lastMerged to keep track of the last node of the merged list. The pointerof the first node of the sublist with the smaller node then advances to the next node ofthat sublist. Figure 18-36 shows the sublist of Figure 18-35 after setting newHead andlastMerged and advancing first1.

first1

18 25 65 85

first2

95

20 30 45 75

FIGURE 18-35 Sublists before merging

1268 | Chapter 18: Searching and Sorting Algorithms

Page 47: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

In Figure 18-36, first1 points to the first node of the first sublist that is yet to bemerged with the second sublist. So, we again compare the nodes pointed to by first1

and first2, and adjust the link of the smaller node and the last node of the merged listso as to move the smaller node to the end of the merged list. For the sublists shown inFigure 18-36, after adjusting the necessary links, we have Figure 18-37.

We continue this process for the remaining elements of both sublists. Every time we move anode to the merged list, we advance either first1 or first2 to the next node. Eventually,either first1 or first2 becomes NULL. If first1 becomes NULL, the first sublist isexhausted first, so we attach the remaining nodes of the second sublist at the end of thepartially merged list. If first2 becomes NULL, the second sublist is exhausted first, so weattach the remaining nodes of the first sublist at the end of the partially merged list.

Following this discussion, we can now write the C++ function mergeList to merge thetwo sorted sublists. The pointers of the first nodes of the sublists are passed as parametersto the function mergeList.

template <class Type>nodeType<Type>* unorderedLinkedList<Type>::

mergeList(nodeType<Type>* first1,nodeType<Type>* first2)

18

newHeadfirst1

18 25 65 85

first2

95

20 30 45 75

lastMerged

FIGURE 18-36 Sublists after setting newHead and lastMerged and advancing first1

newHeadfirst1

18 25 65 85 95

20 30 45 75

lastMerged

first2

FIGURE 18-37 Merged list after putting the node with info 20 at the end of the merged list

Merge Sort: Linked List-Based Lists | 1269

Page 48: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

{nodeType<Type> *lastSmall; //pointer to the last node of

//the merged listnodeType<Type> *newHead; //pointer to the merged list

if (first1 == NULL) //the first sublist is emptyreturn first2;

else if (first2 == NULL) //the second sublist is emptyreturn first1;

else{

if (first1->info < first2->info) //compare the//first nodes

{newHead = first1;first1 = first1->link;lastSmall = newHead;

}else{

newHead = first2;first2 = first2->link;lastSmall = newHead;

}

while (first1 != NULL && first2 != NULL){

if (first1->info < first2->info){

lastSmall->link = first1;lastSmall = lastSmall->link;first1 = first1->link;

}else{

lastSmall->link = first2;lastSmall = lastSmall->link;first2 = first2->link;

}} //end while

if (first1 == NULL) //first sublist is exhausted firstlastSmall->link = first2;

else //second sublist is exhausted firstlastSmall->link = first1;

return newHead;}

}//end mergeList

Finally, we write the recursive merge sort function, recMergeSort, which uses thedivideList and mergeList functions to sort a list. The pointer of the first node of thelist to be sorted is passed as a parameter to the function recMergeSort.

1270 | Chapter 18: Searching and Sorting Algorithms

Page 49: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

template <class Type>void unorderedLinkedList<Type>::recMergeSort(

nodeType<Type>* &head){

nodeType<Type> *otherHead;

if (head != NULL) //if the list is not emptyif (head->link != NULL) //if the list has more than

//one node{

divideList(head, otherHead);recMergeSort(head);recMergeSort(otherHead);head = mergeList(head, otherHead);

}} //end recMergeSort

We can now give the definition of the function mergeSort, which should be included asa public member of the class unorderedLinkedList. (Note that the functionsdivideList, merge, and recMergeSort can be included as private members of theclass unorderedLinkedList because these functions are used only to implement thefunction mergeSort.) The function mergeSort calls the function recMergeSort andpasses first to this function. It also sets last to point to the last node of the list. Thedefinition of the function mergeSort is:

template <class Type>void unorderedLinkedList<Type>::mergeSort(){

recMergeSort(first);

if (first == NULL)last = NULL;

else{

last = first;while (last->link != NULL)

last = last->link;}

} //end mergeSort

We leave it as an exercise for you to write a program to test the merge sort algorithm. SeeProgramming Exercise 13 at the end of this chapter.

Analysis: Merge SortSuppose that L is a list of n elements, in which n > 0. Suppose that n is a power of 2, thatis, n ¼ 2m for some nonnegative integer m, so that we can divide the list into two sublists,each of size:

n

2¼ 2m

2¼ 2m�1:

Moreover, each sublist can also be divided into two sublists of the same size. Each call to thefunction recMergeSort makes two recursive calls to the function recMergeSort, and each

Merge Sort: Linked List-Based Lists | 1271

Page 50: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

call divides the sublist into two sublists of the same size. Suppose that m¼ 3, that is, n¼ 23¼ 8.So, the length of the original list is 8. The first call to the function recMergeSort divides theoriginal list into two sublists, each of size 4. The first call then makes two recursive calls to thefunction recMergeSort. Each of these recursive calls divides each sublist, of size 4, into twosublists, each of size 2. We now have four sublists, each of size 2. The next set of recursive callsdivides each sublist, of size 2, into sublists of size 1. So, we now have eight sublists, each of size 1.It follows that the exponent 3 in 23 indicates the level of the recursion (see Figure 18-38).

Let us consider the general case when n = 2m. Note that the number of recursion levelsis m. Also, note that to merge a sorted list of size s with a sorted list of size t, the maximumnumber of comparisons is s + t � 1.

Consider the function mergeList, which merges two sorted lists into a sorted list. Note thatthis is where the actual work (comparisons and assignments) is done. The initial call to thefunction recMergeSort, at level 0, produces two sublists, each of the size n/2. To mergethese two lists, after they are sorted, the maximum number of comparisons is:

n

2þ n

2� 1 ¼ n� 1 ¼ OðnÞ:

At level 1, we merge two sets of sorted lists, in which each sublist is of the size n/4. To mergetwo sorted sublists, each of the size n/4, we need, at most:

n

4þ n

4� 1 ¼ n

2� 1

8

44

22 2

1

2

Recursion Level: 0Number of calls to recMergeSort: 1Each call: recMergeSort 8 elements

Recursion Level: 1Number of calls to recMergeSort: 2Each call: recMergeSort 4 elements

Recursion Level: 2Number of calls to recMergeSort: 4Each call: recMergeSort 2 elements

Recursion Level: 3Number of calls to recMergeSort: 8Each call: recMergeSort 1 element1 1 11 1 1 1

FIGURE 18-38 Levels of recursion to recMergeSort for a list of length 8

1272 | Chapter 18: Searching and Sorting Algorithms

Page 51: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

comparisons. Thus, at level 1 of the recursion, the number of comparisons is 2(n / 2 – 1) ¼n – 2¼O(n). In general, at level k of the recursion, there are a total of 2k calls to the functionmergeList. Each of these calls merges two sublists, each of the size n / 2k + 1, which requiresa maximum of n / 2k � 1 comparisons. Thus, at level k of the recursion, the maximumnumber of comparisons is:

2k n

2k� 1

� �

¼ n� 2k ¼ OðnÞ:

It now follows that the maximum number of comparisons at each level of the recursion is O(n).Because the number of levels of the recursion is m, the maximum number of comparisonsmade by the merge sort algorithms is O(nm). Now n¼ 2m implies that m¼ log2n. Hence, themaximum number of comparisons made by the merge sort algorithm is O(n log2n).

If W(n) denotes the number of key comparisons in the worst case to sort L, thenW(n) ¼ O(n log2n).

Let A(n) denote the number of key comparisons in the average case. In the average case,during merge, one of the sublists will exhaust before the other list. From this, it follows that,on average, when merging two sorted sublists of combined size n, the number of comparisonswill be less than n � 1. On average, it can be shown that the number of comparisons formerge sort is given by the following equation: If n is a power of 2, A(n) ¼ n log2n � 1.25n ¼O(n log2n). This is also a good approximation when n is not a power of 2.

We can also obtain an analysis of the merge sort algorithm by constructing and solving

certain equations as follows. As noted before, in merge sort, all of the comparisons are

made in the procedure mergeList, which merges two sorted sublists. If one sublist is of

size s and the other sublist is of size t, then merging these lists would require, at most,

s þ t � 1 comparisons in the worst case. Hence:

W ðnÞ ¼ W ðsÞ þW ðtÞ þ s þ t � 1:

Note that s = n / 2 and t = n / 2. Suppose that n = 2m. Then, s = 2m�1 and t = 2m�1. It

follows that s þ t = n. Hence:

W ðnÞ ¼ W ðn=2Þ þW ðn=2Þ þ n � 1 ¼ 2W ðn=2Þ þ n � 1; n > 0:

Also:

W ð1Þ ¼ 0:

It is known that when n is a power of 2, W(n) is given by the following equation:

W ðnÞ ¼ n log2n � ðn � 1Þ ¼ Oðn log2nÞ:

Merge Sort: Linked List-Based Lists | 1273

Page 52: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

(Heap Sort) This chapter also discusses the heap sort algorithm. This algorithm and

its related exercises are available at the Web site, www.course.com/malik/cpp,

accompanying this book.

PROGRAMMING EXAMPLE: Election ResultsThe presidential election for the student council of your local university is about tobe held. The chair of the election committee wants to computerize the voting andhas asked you to write a program to analyze the data and report the winner.

The university has four major divisions, and each division has several departments.For the election, the four divisions are labeled as region 1, region 2, region 3, andregion 4. Each department in each division handles its own voting and reports thevotes received by each candidate to the election committee. The voting is reported inthe following form:

firstName lastName regionNumber numberOfVotes

The election committee wants the output in the following tabular form:

--------------------Election Results--------------------

VotesCandidate Name Region1 Region2 Region3 Region4 Total

------------------ ------- ------- ------- ------- ------Sheila Bower 23 70 133 267 493Danny Dillion 25 71 156 97 349Lisa Fisher 110 158 0 0 268Greg Goldy 75 34 134 0 243Peter Lamba 285 56 0 46 387Mickey Miller 112 141 156 67 476

Winner: Sheila Bower, Votes Received: 493

Total votes polled: 2216

The names of the candidates must be in alphabetical order in the output.

For this program, we assume that six candidates are seeking the student council’spresident post. This program can be enhanced to handle any number of candidates.

The data are provided in two files. One file, candData.txt, consists of the names ofthe candidates seeking the president’s post. The names of the candidates in this file arein no particular order. In the second file, voteData.txt, each line consists of thevoting results in the following form:

Watchthe Video

1274 | Chapter 18: Searching and Sorting Algorithms

Page 53: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

firstName lastName regionNumber numberOfVotes

Each line in the file voteData.txt consists of the candidate’s name, the region number,and the number of votes received by the candidate in that region. There is one entry perline. For example, the input file containing the voting data looks like the following:

Greg Goldy 2 34Mickey Miller 1 56Lisa Fisher 2 56Peter Lamba 1 78Danny Dillion 4 29Sheila Bower 4 78...

The first line indicates that Greg Goldy received 34 votes from region 2.

Input Two files: One containing the candidates’ names and the other containing thevoting data, as described previously.

Output The election results in a tabular form, as described previously, and the winner’s name.

PROBLEM

ANALYSIS

AND

ALGORITHM

DESIGN

From the output, it is clear that the program must organize the voting data by regionand calculate the total votes received by each candidate and polled for the electionoverall. Furthermore, the names of the candidates must appear in alphabetical order.

The main component of this program is a candidate. Therefore, first we will design theclass candidateType to implement a candidate object. Moreover, in this program,we use an array of candidateType object to implement the list of candidates.

Every candidate has a name and receives votes. Because there are four regions, wecan use an array of four components. In Example 10-10 (Chapter 10), we designedthe class personType to implement the name of a person. Recall that an object oftype personType can store the first name and the last name. Now that we havediscussed operator overloading, we redesign the class personType and define therelational operators so that the names of two people can be compared. We will alsooverload the assignment operator for easy assignment and use the stream extractionand insertion operators for input/output. Because every candidate is a person, we willderive the class candidateType from the class personType.

personType The class personType implements the first name and last name of a person.Therefore, the class personType has two member variables: firstName to storethe first name and lastName to store the last name. We declare these as protected sothat the definition of the class personType can be easily extended to accommodatethe requirements of a specific application needed to implement a person’s name. Thedefinition of the class personType is given next.

Programming Example: Election Results | 1275

Page 54: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

//************************************************************// Author: D.S. Malik//// class personType// This class specifies the members to implement a person's// name. It overloads the stream insertion and extraction// operators and relational operators for comparison.//************************************************************

#include <string>

using namespace std;

class personType{

friend istream& operator>>(istream&, personType&);friend ostream& operator<<(ostream&, const personType&);

public:void setName(string first, string last);

//Function to set firstName and lastName according//to the parameters.//Postcondition: firstName = first; lastName = last

string getFirstName() const;//Function to return the first name.//Postcondition: The value of firstName is returned.

string getLastName() const;//Function to return the last name.//Postcondition: The value of lastName is returned.

personType(string first = "", string last = "");//Constructor//Sets firstName and lastName according to the//parameters. The default values of the parameters are//empty strings.//Postcondition: firstName = first; lastName = last

//overload the relational operatorsbool operator==(const personType& right) const;bool operator!=(const personType& right) const;bool operator<=(const personType& right) const;bool operator<(const personType& right) const;bool operator>=(const personType& right) const;bool operator>(const personType& right) const;

protected:string firstName; //variable to store the first namestring lastName; //variable to store the last name

};

1276 | Chapter 18: Searching and Sorting Algorithms

Page 55: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

We now give the definitions of the functions to implement the various operations ofthe class personType.

The definitions of the member functions setName, getFirstName, getLastName,and the constructors are the same as those given in Chapter 10. We, therefore, considerthe definitions of the functions to overload the relational and stream operators.

The names of two people are the same if their first and last names are the same.Therefore, the definition of the function to overload the equality operator is:

bool personType::operator==(const personType& right) const{

return (firstName == right.firstName&& lastName == right.lastName);

}

The names of two people are different if either their first or last names are different.Therefore, the definition of the function to overload the not equal to operator is:

bool personType::operator!=(const personType& right) const{

return (firstName != right.firstName|| lastName != right.lastName);

}

Similarly, the definitions of the functions to overload the remaining relationaloperators are:

bool personType::operator<=(const personType& right) const{

return (lastName <= right.lastName ||(lastName == right.lastName &&firstName <= right.firstName));

}

bool personType::operator<(const personType& right) const{

return (lastName < right.lastName ||(lastName == right.lastName &&firstName < right.firstName));

}

bool personType::operator>=(const personType& right) const{

return (lastName >= right.lastName ||(lastName == right.lastName &&firstName >= right.firstName));

}

Programming Example: Election Results | 1277

Page 56: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

bool personType::operator>(const personType& right) const{

return (lastName > right.lastName ||(lastName == right.lastName &&firstName > right.firstName));

}

The definitions of the functions to overload the stream extraction and insertionoperators are given next.

istream& operator>>(istream& isObject, personType& pName){

isObject >> pName.firstName >> pName.lastName;

return isObject;}

ostream& operator<<(ostream& osObject, const personType& pName){

osObject << pName.firstName << " " << pName.lastName;

return osObject;}

Candidate As remarked previously, the main component of this program is candidate. Everycandidate has a name and can receive votes. Because there are four regions, we canuse an array of four components to store the votes received.

There are six candidates. Therefore, we declare a list of six candidates of typecandidateType. This chapter extended the class unorderedArrayListType byillustrating how to include the searching and sorting algorithms developed inthis chapter. We will use this class to maintain the list of candidates. This list ofcandidates will be sorted and searched. Therefore, we must define (that is, overload)the assignment and relational operators for the class candidateType because theseoperators are used by the searching and sorting algorithms.

Data in the file containing the candidates’ data consists of only the names of thecandidates. Therefore, in addition to overloading the assignment operator so thatthe value of one object can be assigned to another object, we also overload theassignment operator for the class candidateType so that only the name (ofthe personType) of the candidate can be assigned to a candidate object. That is, weoverload the assignment operator twice: once for objects of type candidateType

and once for objects of types candidateType and personType.

//*************************************************************// Author: D.S. Malik//// class candidateType// This class specifies the members to implement the properties

1278 | Chapter 18: Searching and Sorting Algorithms

Page 57: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

// of a candidate. It overloads the assignment operator// and relational operators for comparison.//*************************************************************

#include <string>#include "personType.h"

const int NO_OF_REGIONS = 4;

class candidateType: public personType{public:

const candidateType& operator=(const candidateType&);//Overload the assignment operator for objects of the//type candidateType.

const candidateType& operator=(const personType&);//Overload the assignment operator for objects so that//the value of an object of type personType can be//assigned to an object of type candidateType.

void updateVotesByRegion(int region, int votes);//Function to update the votes of a candidate for a//particular region.//Postcondition: Votes for the region specified by// the parameter are updated by adding// the votes specified by the parameter// votes.

void setVotes(int region, int votes);//Function to set the votes of a candidate for a//particular region.//Postcondition: Votes for the region specified by// the parameter region are set to the votes// specified by the parameter votes.

void calculateTotalVotes();//Function to calculate the total votes received by a//candidate.//Postcondition: The votes in each region are added// and assigned to totalVotes.

int getTotalVotes() const;//Function to return the total votes received by a//candidate.//Postcondition: The value of totalVotes is returned.

void printData() const;//Function to output the candidate's name, the votes//received in each region, and the total votes received.

Programming Example: Election Results | 1279

Page 58: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

candidateType();//Default constructor.//Postcondition: Candidate's name is initialized to// blanks, the number of votes in each// region, and the total votes are// initialized to 0.

//Overload the relational operators.bool operator==(const candidateType& right) const;bool operator!=(const candidateType& right) const;bool operator<=(const candidateType& right) const;bool operator<(const candidateType& right) const;bool operator>=(const candidateType& right) const;bool operator>(const candidateType& right) const;

private:int votesByRegion[NO_OF_REGIONS]; //array to store the

//votes received in//each region

int totalVotes; //variable to store the total votes};

Figure 18-39 shows the UML diagram of the class candidateType.

candidateType

personType

candidateType

-votesByRegion[NO_OF_REGIONS]:int-totalVotes: int

+operator=(const candidateType&): const candidateType&+operator=(const personType&): const candidateType&+updateVotesByRegion(int, int): void+setVotes(int, int): void+calculateTotalVotes(): void+getTotalVotes() const: int+printData() const: void+candidateType()+operator==(const candidateType&) const: bool+operator!=(const candidateType&) const: bool+operator<=(const candidateType&) const: bool+operator<(const candidateType&) const: bool+operator>=(const candidateType&) const: bool+operator>(const candidateType&) const: bool

FIGURE 18-39 UML class diagram of class candidateType

1280 | Chapter 18: Searching and Sorting Algorithms

Page 59: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

The definitions of the functions of the class candidateType are given next.

To set the votes of a particular region, the region number and the number of votesare passed as parameters to the function setVotes. Because an array index starts at 0,region 1 corresponds to the array component at position 0, and so on. Therefore, toset the value of the correct array component, 1 is subtracted from the region. Thedefinition of the function setVotes is:

void candidateType::setVotes(int region, int votes){

votesByRegion[region - 1] = votes;}

To update the votes for a particular region, the region number and the number ofvotes for that region are passed as parameters. The votes are then added to theregion’s previous value. The definition of the function updateVotesByRegion is:

void candidateType::updateVotesByRegion(int region, int votes){

votesByRegion[region - 1] = votesByRegion[region - 1]+ votes;

}

The definitions of the functions calculateTotalVotes, getTotalVotes,printData, and the default constructor are quite straightforward and are given next.

void candidateType::calculateTotalVotes(){

int i;

totalVotes = 0;

for (i = 0; i < NO_OF_REGIONS; i++)totalVotes += votesByRegion[i];

}

int candidateType::getTotalVotes() const{

return totalVotes;}

void candidateType::printData() const{

cout << left<< setw(8) << firstName << " "<< setw(8) << lastName << " ";

cout << right;for (int i = 0; i < NO_OF_REGIONS; i++)

cout << setw(8) << votesByRegion[i] << " ";cout << setw(7) << totalVotes << endl;

}

Programming Example: Election Results | 1281

Page 60: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

candidateType::candidateType(){

for (int i = 0; i < NO_OF_REGIONS; i++)votesByRegion[i] = 0;

totalVotes = 0;}

To overload the relational operators for the class candidateType, the names of thecandidates are compared. For example, two candidates are the same if they have the samename. The definitions of these functions are similar to the definitions of the functions tooverload the relational operators for the class personType and are given next.

bool candidateType::operator==(const candidateType& right) const{

return (firstName == right.firstName&& lastName == right.lastName);

}bool candidateType::operator!=(const candidateType& right) const{

return (firstName != right.firstName|| lastName != right.lastName);

}

bool candidateType::operator<=(const candidateType& right) const{

return (lastName <= right.lastName ||(lastName == right.lastName &&firstName <= right.firstName));

}

bool candidateType::operator<(const candidateType& right) const{

return (lastName < right.lastName ||(lastName == right.lastName &&firstName < right.firstName));

}

bool candidateType::operator>=(const candidateType& right) const{

return (lastName >= right.lastName ||(lastName == right.lastName &&firstName >= right.firstName));

}

bool candidateType::operator>(const candidateType& right) const{

return (lastName > right.lastName ||(lastName == right.lastName &&firstName > right.firstName));

}

1282 | Chapter 18: Searching and Sorting Algorithms

Page 61: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

const candidateType& candidateType::operator=(const candidateType& right)

{if (this != &right) // avoid self-assignment{

firstName = right.firstName;lastName = right.lastName;

for (int i = 0; i < NO_OF_REGIONS; i++)votesByRegion[i] = right.votesByRegion[i];

totalVotes = right.totalVotes;}

return *this;}

const candidateType& candidateType::operator=(const personType& right)

{firstName = right.getFirstName();lastName = right.getLastName();

return *this;}

MAIN PROGRAM Now that the class candidateType has been designed and implemented, we focuson designing the main program.

Because there are six candidates, we create a list, candidateList, containing sixcomponents of type candidateType. The first thing that the program should do isread each candidate’s name from the file candData.txt into the list candidateList.Then, we sort candidateList.

The next step is to process the voting data from the file voteData.txt, which holdsthe voting data. After processing the voting data, the program should calculate thetotal votes received by each candidate and print the data, as shown previously. Thus,the general algorithm is:

1. Read each candidate’s name into candidateList.

2. Sort candidateList.

3. Process the voting data.

4. Calculate the total votes received by each candidate.

5. Print the results.

The following statement creates the object candidateList.

unorderedArrayListType<candidateType> candidateList(NO_OF_CANDIDATES);

Figure 18-40 shows the object candidateList. Every component of the array list

is an object of type candidateType.

Programming Example: Election Results | 1283

Page 62: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

In Figure 18-40, the array votesByRegion and the variable totalVotes are initialized to0 by the default constructor of the class candidateType. To save space, wheneverneeded, we will draw the object candidateList, as shown in Figure 18-41.

candidateList

length

maxSize

6

6

list

firstName

lastName

votesByRegion 0 0

totalVotes 0

list[0]

0 0

list[1]

list[2]

list[3]

list[4]

list[5]

list[0]

FIGURE 18-40 candidateList

candidateList

length

maxSize

6

6

list

list[0] 0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

list[1]

list[2]

list[3]

list[4]

list[5]

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

FIGURE 18-41 candidateList

1284 | Chapter 18: Searching and Sorting Algorithms

Page 63: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

fillNames The first thing that the program must do is read the candidates’ names intocandidateList. Therefore, we write a function to accomplish this task. Thefile candData.txt is opened in the function main. The names of the input fileand candidateList are, therefore, passed as parameters to the functionfillNames. Because the member variable list of the object candidateList isprotected, it cannot be accessed directly. We, therefore, create an object tempof type candidateType to store the candidates’ names and use the functioninsertEnd (of list) to store each candidate’s name in the object candidateList.The definition of the function fillNames follows:

void fillNames(ifstream& inFile,unorderedArrayListType<candidateType>& cList)

{string firstN;string lastN;int i;candidateType temp;

for (i = 0; i < NO_OF_CANDIDATES; i++){

inFile >> firstN >> lastN;temp.setName(firstN, lastN);cList.insertEnd(temp);

}}

Figure 18-42 shows the object candidateList after a call to the function fillNames.

Programming Example: Election Results | 1285

Page 64: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

Sort Names After reading the candidates’ names, we next sort the array list of the objectcandidateList using any of the (array-based) sorting algorithms discussed in thischapter. Because candidateList is an object of type unorderedArrayListType,we use the member function sort to sort candidateList. (For illustration purposes,we use selection sort in the function sort. In fact, you can use any array-based sortingalgorithm discussed in this chapter.) The following statement accomplishes this task:

candidateList.sort();

After this statement executes, candidateList is as shown in Figure 18-43.

candidateList

length

maxSize

6

6

list

list[0] 0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

list[1]

list[2]

list[3]

list[4]

list[5]

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

Greg Goldy

Mickey Miller

Lisa Fisher

Peter Lamba

Danny Dillion

Sheila Bower

FIGURE 18-42 Object candidateList after a call to the function fillNames

1286 | Chapter 18: Searching and Sorting Algorithms

Page 65: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

Process

Voting Data

Processing the voting data is quite straightforward. Each entry in the filevoteData.txt is of the form:

firstName lastName regionNumber numberOfVotes

After reading an entry from the file voteData.txt, we locate the row in the arraylist (of the object candidateList) corresponding to the specific candidate andupdate the entry specified by regionNumber.

The component votesByRegion is a private member of each component of thearray list. Moreover, list is a private member of candidateList. The onlyway we can update the votes of a candidate is to make a copy of that candidate’srecord into a temporary object, update the object, and then copy the temporaryobject back into list by replacing the old value with the new value of thetemporary object. We can use the member function retrieveAt to make a copy ofthe candidate whose votes need to be updated. After updating the temporary object,we can use the member function replaceAt to copy the temporary object back intothe list. Suppose the next entry read is:

Lisa Fisher 2 35

This entry says that Lisa Fisher received 35 votes from region 2. Suppose thatbefore processing this entry, candidateList is as shown in Figure 18-44.

candidateList

length

maxSize

6

6

list

list[0] 0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

list[1]

list[2]

list[3]

list[4]

list[5]

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

Sheila Bower

Danny Dillion

Lisa Fisher

Greg Goldy

Peter Lamba

Mickey Miller

FIGURE 18-43 Object candidateList after the statement candidateList.sort(); executes

Programming Example: Election Results | 1287

Page 66: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

We make a copy of the row corresponding to Lisa Fisher (see Figure 18-45).

Next, the following statement updates the voting data for region 2. (Here, region = 2

and votes = 35.)

temp.updateVotesByRegion(region, votes);

After this statement executes, the object temp is as shown in Figure 18-46.

candidateList

length

maxSize

6

6

list

list[0] 0 0 50 0 0

80 0 0 0 0

100 0 0 20 0

list[1]

list[2]

list[3]

list[4]

list[5]

10 0 56 0 0

76 13 0 0 0

0 45 0 0 0

Sheila Bower

Danny Dillion

Lisa Fisher

Greg Goldy

Peter Lamba

Mickey Miller

FIGURE 18-44 Object candidateList before processing entry Lisa Fisher 2 35

temp

region

76 13 0 0 0Lisa Fisher

FIGURE 18-45 Object temp

1288 | Chapter 18: Searching and Sorting Algorithms

Page 67: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18Now we copy the object temp into list (see Figure 18-47).

Because the member list of candidateList is sorted, we can use the binary searchalgorithm to find the row position in list corresponding to the candidate whose votesneed to be updated. Essentially, the definition of the function processVotes is:

void processVotes(ifstream& inFile,unorderedArrayListType<candidateType>& cList)

{string firstN;string lastN;int region;

candidateList

length

maxSize

6

6

list

list[0] 0 0 50 0 0

80 0 0 0 0

100 0 0 20 0

list[1]

list[2]

list[3]

list[4]

list[5]

10 0 56 0 0

76 48 0 0 0

0 45 0 0 0

Sheila Bower

Danny Dillion

Lisa Fisher

Greg Goldy

Peter Lamba

Mickey Miller

FIGURE 18-47 candidateList after copying temp

temp

region

76 48 0 0 0Lisa Fisher

FIGURE 18-46 Object temp after temp.updateVotesByRegion(region,votes); executes

Programming Example: Election Results | 1289

Page 68: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

int votes;int candLocation;

candidateType temp;

inFile >> firstN >> lastN >> region >> votes;

temp.setName(firstN, lastN);temp.setVotes(region, votes);

while (inFile){

candLocation = cList.binSearch(temp);

if (candLocation != -1){

cList.retrieveAt(candLocation, temp);temp.updateVotesByRegion(region, votes);cList.replaceAt(candLocation, temp);

}

inFile >> firstN >> lastN >> region >> votes;

temp.setName(firstN, lastN);temp.setVotes(region, votes);

}}

Add Votes After processing the voting data, the next step is to find the total votes received byeach candidate. This is done by adding the votes received in each region.

Now votesByRegion is a private member of candidateType, and list is aprotected member of candidateList. Therefore, to add the votes for eachcandidate, we use the function retrieveAt to make a temporary copy of eachcandidate’s data, add the votes in the temporary object, and then copy the temporaryobject back into candidateList. The following function does this:

void addVotes(unorderedArrayListType<candidateType>& cList){

int i;

candidateType temp;

for (i = 0; i < NO_OF_CANDIDATES; i++){

cList.retrieveAt(i, temp);temp.calculateTotalVotes();cList.replaceAt(i, temp);

}}

1290 | Chapter 18: Searching and Sorting Algorithms

Page 69: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

Figure 18-48 shows candidateList after adding the votes for each candidate—thatis, after a call to the function addVotes.

Print

Heading and

Print Results

To complete the program, we include a function to print the heading, whichoutputs the first four lines of the output. The following function accomplishes thistask:

void printHeading(){

cout << " --------------------Election Results---------"<< "-----------" << endl << endl;

cout << " Votes" << endl;cout << " Candidate Name Region1 Region2 Region3 "

<< "Region4 Total"<<endl;cout << "------------------ ------- ------- "

<< "------- ------- ------" << endl;}

We now describe the function printResults, which prints the results. Suppose thatthe variable sumVotes holds the total votes polled for the election, the variablelargestVotes holds the largest number of votes received by a candidate, and thevariable winLoc holds the index of the winning candidate in the array list. Further

candidateList

length

maxSize

6

6

list

list[0] 23 70 133 267 493

285 56 0 46 387

112 141 156 67 476

list[1]

list[2]

list[3]

list[4]

list[5]

25 71 156 97 349

110 158 0 0 268

75 34 134 0 243

Sheila Bower

Danny Dillion

Lisa Fisher

Greg Goldy

Peter Lamba

Mickey Miller

FIGURE 18-48 candidateList after a call to the function addVotes

Programming Example: Election Results | 1291

Page 70: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

suppose that temp is an object of type candidateType. The algorithm for thisfunction is:

1. Initialize sumVotes, largestVotes, and winLoc to zero.

2. For each candidate:

a. Retrieve the candidate’s data into temp.

b. Print the candidate’s name and relevant data.

c. Retrieve the total votes received by the candidate and updatesumVotes.

d. if (largestVotes < temp.getTotalVotes()){

largestVotes = temp.getTotalVotes();winLoc = i;

}

3. Output the final lines of output.

We leave the definition of the function printResults as an exercise. (See Pro-gramming Exercise 18.)

PROGRAM LISTING (MAIN PROGRAM)

//*************************************************************// Author: D.S. Malik//// This program processes voting data for the student council// president’s post. It outputs each candidate's name and the// votes they received. The name of the winner is also printed.//*************************************************************

#include <iostream>#include <string>#include <fstream>#include "candidateType.h"#include "unorderedArrayListType.h"

using namespace std;

const int NO_OF_CANDIDATES = 6;

void fillNames(ifstream& inFile,unorderedArrayListType<candidateType>& cList);

void processVotes(ifstream& inFile,unorderedArrayListType<candidateType>& cList);

void addVotes(unorderedArrayListType<candidateType>& cList);

void printHeading();void printResults

(const unorderedArrayListType<candidateType>& cList);

1292 | Chapter 18: Searching and Sorting Algorithms

Page 71: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

int main(){

unorderedArrayListType<candidateType>candidateList(NO_OF_CANDIDATES);

candidateType temp;

ifstream inFile;

inFile.open("candData.txt");if (!inFile){

cout << "Input file (candData.txt) does not exist. "<< "Program terminates!!" << endl;

return 1;}

fillNames(inFile, candidateList);

candidateList.sort();

inFile.close();inFile.clear();

inFile.open("voteData.txt");if (!inFile){

cout << "Input file (voteData.txt) does not exist. "<< "Program terminates!!" << endl;

return 1;}

processVotes(inFile, candidateList);

addVotes(candidateList);

printHeading();printResults(candidateList);

return 0;}

//Place the definitions of the functions fillNames,//addVotes, processVotes, and printHeading here. Also, write and place//the definition of the function printResults here.

Sample Run: After you have written the definitions of the functions of the classcandidateType and of the function printResults and then run your program, itshould produce the following output. (See Programming Exercise 18.)

Programming Example: Election Results | 1293

Page 72: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

--------------------Election Results--------------------

VotesCandidate Name Region1 Region2 Region3 Region4 Total

------------------ ------- ------- ------- ------- ------Sheila Bower 23 70 133 267 493Danny Dillion 25 71 156 97 349Lisa Fisher 110 158 0 0 268Greg Goldy 75 34 134 0 243Peter Lamba 285 56 0 46 387Mickey Miller 112 141 156 67 476

Winner: Sheila Bower, Votes Received: 493

Total votes polled: 2216

Input Files candData.txt

Greg GoldyMickey MillerLisa FisherPeter LambaDanny DillionSheila Bower

voteData.txt

Greg Goldy 2 34Mickey Miller 1 56Lisa Fisher 2 56Peter Lamba 1 78Danny Dillion 4 29Sheila Bower 4 78Mickey Miller 2 63Lisa Fisher 1 23Peter Lamba 2 56Danny Dillion 1 25Sheila Bower 2 70Peter Lamba 4 23Danny Dillion 4 12Greg Goldy 3 134Sheila Bower 4 100Mickey Miller 3 67Lisa Fisher 2 67Danny Dillion 3 67Sheila Bower 1 23Mickey Miller 1 56Lisa Fisher 2 35Sheila Bower 3 78Peter Lamba 1 27Danny Dillion 2 34

1294 | Chapter 18: Searching and Sorting Algorithms

Page 73: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

QUICK REVIEW

1. The sequential search algorithm searches the list for a given item, startingwith the first element in the list. It continues to compare the search itemwith the elements in the list until either the item is found or no moreelements are left in the list with which it can be compared.

2. On average, the sequential search algorithm searches half of the list.

3. For a list of length n, in a successful search, on average, the sequential search

makesnþ 1

2¼ OðnÞ comparisons.

4. A sequential search is not efficient for large lists.

5. A binary search is much faster than a sequential search.

6. A binary search requires the list elements to be in order, that is, sorted.

7. To search for an item in a list of length 1024, a binary search requires nomore than 11 iterations of the loop, and so no more than 22 comparisons.

8. For a list of length n, in a successful search, on average, the binary searchmakes 2log2n � 3 key comparisons.

9. Let f be a function of n. By the term asymptotic, we mean the study of thefunction f as n becomes larger and larger without bound.

10. Let f and g be real-valued functions. Assume that f and g are nonnegative,that is, for all real numbers n, f (n) � 0 and g(n) � 0. We say that f (n) isBig-O of g(n), written f (n) = O(g(n)), if there exist positive constants c andn0 such that f (n) � cg(n) for all n � n0.

11. Let f (n) be a nonnegative, real-valued function such that f (n) = amnm þam�1n

m�1 þ � � � þa1n þ a0, wherein ais are real numbers, am 6¼ 0, n � 0,and m is a nonnegative integer. Then, f (n) = O(nm).

18

Greg Goldy 1 75Peter Lamba 4 23Sheila Bower 3 55Mickey Miller 4 67Peter Lamba 1 23Danny Dillion 3 89Mickey Miller 3 89Peter Lamba 1 67Danny Dillion 2 37Sheila Bower 4 89Mickey Miller 2 78Lisa Fisher 1 87Peter Lamba 1 90Danny Dillion 4 56

Quick Review | 1295

Page 74: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

12. Let L be a list of size n > 1. Suppose that the elements of L are sorted. IfSRH(n) is the minimum number of comparisons needed, in the worst case,by using a comparison-based algorithm to recognize whether an element xis in L, then SRH(n) � log2(n + 1).

13. The binary search algorithm is the optimal worst-case algorithm for solvingsearch problems by using the comparison method.

14. To construct a search algorithm of the order less than log2n, it cannot becomparison based.

15. For a list of length n, on average, the bubble sort algorithm makesnðn� 1Þ

2key comparisons and about

nðn� 1Þ4

item assignments.

16. The selection sort algorithm sorts a list by finding the smallest (or equiva-lently largest) element in the list and then moving it to the beginning (orend) of the list.

17. For a list of length n, in which n > 0, the selection sort algorithm makes1

2n2� 1

2n key comparisons and 3(n � 1) item assignments.

18. For a list of length n, in which n > 0, on average, the insertion sort algorithm

makes1

4n2 + O(n) key comparisons and

1

4n2 þ O(n) item assignments.

19. Let L be a list of n distinct elements. Any sorting algorithm that sorts L bycomparison of the keys only, in its worst case, makes at least O(nlog2n) keycomparisons.

20. Both the quick sort and merge sort algorithms sort a list by partitioning it.

21. To partition a list, the quick sort algorithm first selects an item from the listcalled pivot. The algorithm then rearranges the elements so that theelements in one of the sublists are less than pivot and the elements inthe other sublist are greater than or equal to pivot.

22. In a quick sort, the sorting work is done in partitioning the list.

23. On average, the number of key comparisons in a quick sort is O(nlog2n). Inthe worst case, the number of key comparisons in a quick sort is O(n2).

24. The merge sort algorithm partitions the list by dividing it in the middle.

25. In a merge sort, the sorting work is done in merging the list.

26. The number of key comparisons in a merge sort is O(nlog2n).

EXERCISES

1. Mark the following statements as true or false.

a. A sequential search of a list assumes that the list is in ascending order.

b. A binary search of a list assumes that the list is sorted.

1296 | Chapter 18: Searching and Sorting Algorithms

Page 75: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

c. A binary search is faster on ordered lists and slower on unordered lists.

d. A binary search is faster on large lists, but a sequential search is faster onsmall lists.

2. Consider the following list:

35, 82, 45, 12, 56, 67, 92, 77

Using the sequential search as described in this chapter, how many compar-isons are required to find whether the following items are in the list? (Recallthat by comparisons we mean item comparisons, not index comparisons.)

a. 12 b. 92 c. 65 d. 35

3. a. Write a version of the sequential search algorithm that can be used tosearch a sorted list.

b. Consider the following list:

8, 12, 15, 27, 35, 48, 65, 77, 86, 94, 120

Using a sequential search on ordered lists, which you designed in (a), howmany comparisons are required to determine whether the following itemsare in the list? (Recall that comparisons mean item comparisons, not indexcomparisons.)

i. 65 ii. 8 iii. 80 iv. 125

4. Consider the following list:

5, 12, 25, 32, 38, 46, 58, 62, 85, 90, 97, 105, 110

Using the binary search as described in this chapter, how many comparisonsare required to find whether the following items are in the list? Show thevalues of first, last, and middle and the number of comparisons aftereach iteration of the loop.

a. 32 b. 20 c. 105 d. 60

5. Suppose that L is a sorted list of 4096 elements. What is the maximum numberof comparisons made by the binary search algorithm, given in this chapter, todetermine if an item is in L?

6. Sort the following list using the bubble sort algorithm as discussed in thischapter. Show the list after each iteration of the outer for loop.

38, 60, 43, 5, 70, 58, 15, 10

7. a. The number of comparisons in the best case of a bubble sort algorithm, asgiven in this chapter, is O(n2). Show that the following version of thebubble sort algorithm reduces the number of comparisons in the bestcase of the bubble sort algorithm to O(n).

18

Exercises | 1297

Page 76: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

//list – list to be sorted//elemType – type of the list elements//length – length of the list

bool isSorted = false;

for (int iteration = 1; (iteration < length) && !isSorted;iteration++)

{isSorted = true; //assume that the sublist is sorted

for (int index = 0; index < length - iteration; index++){

if (list[index] > list[index + 1]){

elemType temp = list[index];list[index] = list[index + 1];list[index + 1] = temp;isSorted = false;

}}

}

b. Using the algorithm given in part (a), find the number of iterationsthat are needed to sort the following list:

65, 14, 52, 43, 75, 25, 80, 90, 95

8. Sort the following list using the bubble sort algorithm as discussed in thischapter. Show the list after each iteration of the outer for loop.

46, 58, 16, 25, 83, 98, 8, 70, 5, 62

9. Assume the following list of keys:

8, 28, 31, 20, 55, 46

The first three keys are in order. To move 20 to its proper position usingthe insertion sort algorithm as described in this chapter, exactly how manykey comparisons are executed?

10. Assume the following list of keys:

12, 38, 45, 50, 55, 5, 30

The first five keys are in order. To move 5 to its proper position using theinsertion sort algorithm as described in this chapter, exactly how many keycomparisons are executed?

11. Assume the following list of keys:

25, 32, 20, 15, 45, 4, 18, 91, 62, 88, 66

This list is to be sorted using the insertion sort algorithm as described in thischapter for array-based lists. Show the resulting list after seven passes of thesorting phase—that is, after seven iterations of the for loop.

1298 | Chapter 18: Searching and Sorting Algorithms

Page 77: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

18

12. Recall the insertion sort algorithm (contiguous version) as discussed in thischapter. Assume the following list of keys:

30, 20, 35, 27, 96, 82, 56, 60, 48, 75, 5, 80

Exactly how many key comparisons are executed to sort this list using theinsertion sort algorithm?

13. Both the merge sort and quick sort algorithms sort a list by partitioning it.Explain how the merge sort algorithm differs from the quick sort algorithmin partitioning the list.

14. Assume the following list of keys:

36, 55, 89, 95, 65, 75, 13, 62, 86, 9, 23, 74, 2, 100, 98

This list is to be sorted using the quick sort algorithm as discussed in this chapter.Use pivot as the middle element of the list.

a. Give the resulting list after one call to the function partition.

b. What is the size of the list that the function partition partitioned?

c. What are the sizes of the two sublists created by the function partition?

15. Suppose that the list of keys is as given in Exercise 14 and that this list is tobe sorted using the quick sort algorithm as discussed in this chapter. Usepivot as the middle element of the list.

a. Give the resulting list after two calls to the function partition.

b. What is the size of the list that the function partition partitioned?

c. What are the sizes of the two sublists created by the function partition?

16. Suppose that the list of keys is as given in Exercise 14. Use the quick sortalgorithm, as discussed in this chapter, to determine the number of times thefunction partition is called to completely sort the list.

17. Assume the following list of keys:

48, 30, 66, 50, 9, 95, 80, 15, 25, 18, 94, 55, 3, 22, 62

This list is to be sorted using the quick sort algorithm as discussed in this chapter.Use pivot as the median of the first, last, and middle elements of the list.

a. What is the pivot?

b. Give the resulting list after one call to the function partition.

c. What is the size of the list that the function partition partitioned?

d. What are the sizes of the two sublists created by the functionpartition?

18. Suppose that the list of keys is as given in Exercise 17 and that this list is tobe sorted using the quick sort algorithm as discussed in this chapter. Usepivot as the median of the first, last, and middle elements of the list.

a. What is the pivot during the second call of the function partitioned?

b. Give the resulting list after two calls to the function partition.

Exercises | 1299

Page 78: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

c. What is the size of the list that the function partition partitioned?

d. What are the sizes of the two sublists created by the function partition?

19. Suppose that the list of keys is as given in Exercise 17. Use the quick sortalgorithm, as discussed in this chapter, to determine the number of times thefunction partition is called to completely sort the list.

20. Suppose that L is a list of 10,000 elements. Find the average number ofcomparisons made by bubble sort, selection sort, and insertion sort to sort L.

21. Suppose that L is a list of 10,000 elements. Find the average number ofcomparisons made by quick sort and merge sort to sort L.

22. Suppose that the elements of a list are in descending order and they need to be putin ascending order. Write a C++ function that takes as input an array of items indescending order and the number of elements in the array. The function rear-ranges the element of the array in ascending order. Your function must notincorporate any sorting algorithms, that is, no item comparisons should take place.

PROGRAMMING EXERCISES

1. (Recursive sequential search) The sequential search algorithm given inthis chapter is nonrecursive. Write and implement a recursive version of thesequential search algorithm.

2. (Recursive binary search) The binary search algorithm given in thischapter is nonrecursive. Write and implement a recursive version of thebinary search algorithm. Also, write a program to test your algorithm.

3. Write a program to test the function you designed in Exercise 3.

4. Write a program to find the number of comparisons using binarySearchand the sequential search algorithm as follows:

Suppose list is an array of 1000 elements.

a. Use a random number generator to fill list.

b. Use any sorting algorithm to sort list.

c. Search list for some items as follows:

i. Use the binary search algorithm to search the list. (You may needto modify the algorithm given in this chapter to count the numberof comparisons.)

ii. Use the binary search algorithm to search the list, switching to asequential search when the size of the search list reduces to lessthan 15. (Use the sequential search algorithm for a sorted list.)

d. Print the number of comparisons for Steps c(i) and c(ii). If the item isfound in the list, then print its position.

1300 | Chapter 18: Searching and Sorting Algorithms

Page 79: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

5. (Modified Bubble Sort) Write a complete C++ function template toimplement the modified bubble sort algorithm given in Exercise 7 of thischapter. Call this function modifiedBubbleSort. Also, write a program totest your function.

6. Write a program to test the selection sort algorithm for array-based lists asgiven in this chapter.

7. Write and test a version of the selection sort algorithm for linked lists.

8. Write a program to test the insertion sort algorithm for array-based lists asgiven in this chapter.

9. Write and test a version of the insertion sort algorithm for linked lists.

10. Write a program to test the quick sort algorithm for array-based lists asgiven in this chapter.

11. (C. A. R. Hoare) Let L be a list of size n. The quick sort algorithm can be usedto find the kth smallest item in L, wherein 0� k� n� 1, without completelysorting L. Write and implement a C++ function, kThSmallestItem, thatuses a version of the quick sort algorithm to determine the kth smallest item inL without completely sorting L.

12. Sort an array of 10,000 elements using the quick sort algorithm as follows:

a. Sort the array using pivot as the middle element of the array.

b. Sort the array using pivot as the median of the first, last, andmiddle elements of the array.

c. Sort the array using pivot as the middle element of the array. How-ever, when the size of any sublist reduces to less than 20, sort the sublistusing an insertion sort.

d. Sort the array using pivot as the median of the first, last, andmiddle elements of the array. When the size of any sublist reduces toless than 20, sort the sublist using an insertion sort.

e. Calculate and print the CPU time for each of the preceding four steps.

To find the current CPU time, declare a variable, say, x, of type clock_t.The statement x = clock(); stores the current CPU time in x. You cancheck the CPU time before and after a particular phase of a program. Then,to find the CPU time for that particular phase of the program, subtract thebefore time from the after time. Moreover, you must include the header filectime to use the data type clock_t and the function clock. Use a randomnumber generator to initially fill the array.

13. Write a program to test the merge sort algorithm for linked lists as given inthis chapter.

14. Write and test a version of the merge sort algorithm for array-based lists.

18

Programming Exercises | 1301

Page 80: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

15. Write a program that creates three identical arrays, list1, list2, andlist3, of 5000 elements. The program then sorts list1 using bubble sort,list2 using selection sort, and list3 using insertion sort and outputsthe number of comparisons and item assignments made by each sortingalgorithm.

16. Write a program that creates three identical lists, list1, list2, and list3,of 5000 elements. The program then sorts list1 using quick sort, list2using insertion sort, and list3 using merge sort and outputs the number ofcomparisons and item assignments made by quick sort and insertion sort andthe number of comparisons made by merge sort.

17. Write a program to test the function you designed in Exercise 22.

18. Write the definitions of the function printResults of the ElectionResults programming example. Also, write a program to produce the out-put shown in the sample run of this programming example.

19. In the Election Results programming example, the class candidateTypecontains a function calculateTotalVotes, which calculates the total num-ber of votes received by a candidate. After processing the voting data, thisfunction calculates the total number of votes for a candidate. The functionupdateVotesByRegion (of the class candidateType) updates only thenumber of votes for a particular region. Modify the definition of this functionso that it also updates the total number of votes received by the candidate. Bydoing so, the function addVotes in the main program is no longer needed.Modify and run your program with the modified definition of the functionupdateVotesByRegion.

20. In the Election Results programming example, the object candidateList oftype unorderedArrayListType is declared to process the voting data.The operations of inserting a candidate’s data and updating and retrievingthe votes were somewhat complicated. The member variable list is aprotected member of candidateList, and each component of list is aprivate member. To update the candidates’ votes, copy each candidate’s datafrom candidateList into a temporary object of type candidateType,update the temporary object, and then replace the candidate’s datawith the temporary object. In this exercise, you are to modify the ElectionResults programming example to simplify the accessing of a candidate’sdata. Derive the class candidateListType from the classunorderedArrayListType as follows:

class candidateListType:public unorderedArrayListType<candidateType>

{public:

candidateListType(int size = 0);//constructor

void processVotes(string fName, string lName, int region,int votes);

1302 | Chapter 18: Searching and Sorting Algorithms

Page 81: S EARCHING AND S ORTING A LGORITHMS - Dr. Juan ... S EARCHING AND S ORTING A LGORITHMS IN THIS CHAPTER, YOU WILL:. Learn the various search algorithms. Explore how to implement the

C7958_C18

//Function to update the number of votes for//a particular candidate for a particular region.//The name of the candidate, the region number, and//the number of votes are passed as parameters.

void addVotes();//Function to find the total number of votes//received by each candidate.

void printResult();//Function to output the voting data.

};

Because the class candidateListType is derived from the classunorderedArrayListType, and list is a protected member of theclass unorderedArrayListType (inherited from the classarrayListType), list can be directly accessed by a member of the classcandidateListType.

Write the definitions of the member functions of the classcandidateListType. Rewrite and run your program using the classcandidateListType.

18

Programming Exercises | 1303