using arrays in abstract data types

85
2003 Prentice Hall, Inc. All rights reserved. Using Arrays in Abstract Data Types

Upload: palmer-santana

Post on 02-Jan-2016

26 views

Category:

Documents


1 download

DESCRIPTION

Using Arrays in Abstract Data Types. What is an Abstract Data Type. A built-in data type is an int, float, double, etc. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Using Arrays in Abstract Data Types

Page 2: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

What is an Abstract Data Type

• A built-in data type is an int, float, double, etc.• An Abstract Data Type (ADT) is a collection of

data and a set of operations on the data. You can use an ADT’s operations, if you know their specifications, without knowing how the operations are implemented or how the data is stored. Ultimately, you will implement an ADT with a data-structure, which is a construct you can define within a programming language to store a collection of data.

• Examples of ADT: lists, stacks, queues, trees, graphs, etc.

Page 3: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

ADT: SIMPLE LIST

Examples of lists: lists of student id’s in a class, grocery items, lists of records in a collection, list of club members, etc….

Create a list

Insert an element

Arrange elements in sorted order

Find if an element is in the list

Delete an element

Print the list of elements

WHAT ARE BASIC OPERATIONS ON A LIST?

Page 4: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

What operations are likely to be performed on lists?

Create/Insert an element

Delete an element

Arrange elements in sorted order (whatever sort criteria)

Print the list of elements

Find if an element is in the list

Print statistics about list (if numeric)

Grocery items:ChipsSalsaCoke

Tissues Sprite

Jelly beans

Original list

Grocery items:ChipsSalsaCoke

Tissues Sprite

Jelly beansBeer

Add Beer

Grocery items:ChipsSalsaCokeSprite

Jelly beansBeer

Delete tissues

Grocery items:BeerChipsCoke

Jelly beans SalsaSprite

Sort alphabetically

Grocery items:BeerCoke Sprite

Jelly beans ChipsSalsa

Sort by grocery aisles

Is beer on the list?

Page 5: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Implementation of the ADT List

One way to implement a “list” is using an array to hold the elements in the list…..

Now have to figure out how to : insert, delete, sort, find, etc….

In the next lessons, we will slowly build up these functionalities until we can integrate them all into a “list” program. EVENTUAL GOAL : CREATE A PROGRAM TO MAINTAIN A LIST OF STUDENTS……….

Page 6: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Let’s make a simpler list

• Instead of strings, we will have a list of letters

const int MAXCHARS = 7;

char alpharray[MAXCHARS];

B J K M S Z

0 1 2 3 4 5 6 7

Page 7: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Print Elements in a list

for (i=0; i<numofelements; i++)

cout << alpharray[i] << endl;

Input elements into the list:// numtoinsert should be set to the number of initial elements

to insert

for (i=0; i<numtoinsert; i++)

cin >> alpharray[i];

Page 8: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Insert an element into an array

• Simple insert routine: find end of array, insert element:

alpharray[endofarray] = newelement;

endofarray++;

B J K M S Z

B J K M S Z L

Before:

After inserting L

Page 9: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Insert a letter in the list

• Should it be inserted at the end of the list (in this case we need to know what is the end of the list)?

• Should the new element be inserted into the beginning of the list?

• Is the list stored in some special order and elements should be inserted to maintain that order – e.g., if the list is stored in alphabetical order the new element must be inserted in alphabetical order?

• Should the user choose where to store the new element?

Page 10: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Assume the following letters are stored in array named alpharray: B, J, K, M, S, and Z. Write a program which calls a function adlet(), which accepts both the alphabet array and a new letter as parameters and inserts the new letter in the correct alphabetical order in the alphabet array.

B J K M S Z

alphabet [0] [1] [2] [3] [4] [5] [6] [7] …...

B J K L M S ZAfter adding ‘L’

Before:

INSERTING INTO A ARRAY BASED Alphabetical LIST

Page 11: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

ALGORITHM:

•Prompt user for new letter to add

•Find the position (index) of where this letter should go in the alphabetical array. (This is called a linear search.)

•Move all letters after this position down to free up the space

•Insert letter into array****

Page 12: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

#include <iostream>void insertletter(char[],char,int&);

int main() { const int MAXCHARS = 30; const int STARTCHARS=6; char alpharray[MAXCHARS] = {‘B’, ‘J’, ‘K’, ‘M’,’S’,’Z’}; char newlet; int sizeofarray=STARTCHARS;

while (5) { //loop forever

cout << “ Enter a letter to add:”; cin >> newlet; insertletter(alpharray,newlet,sizeofarray); } }

CONTINUED…..

Page 13: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Find position for new letter

//find position for new letter

while (alpharray[i] < addlet && i < sizeofarray)

i++;

newpos =i;

Page 14: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Find position for new letter

//move chars over --- should check for full array first

if (sizeofarr == MAXCHARS) …..

for (i=sizeofarr; i>newpos; i--)

alpharray[i] = alpharray[i-1];

Page 15: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

void insertletter(char alpharray[], char addlet, int& sizeofarr){ int i=0, endpos,newpos; //find position for new letter while (alpharray[i] < addlet && i < sizeofarr) i++; newpos =i; //move chars over --- should check for full array first for (i=sizeofarr; i>newpos; i--) alpharray[i] = alpharray[i-1];

alpharray[newpos] = addlet; //insert new letter sizeofarr++; //print out array for(i=0; i<sizeofarr; i++) cout <<alpharray[i]; }

Page 16: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Analysis of the simple insertion algorithm

• In the worst case --- How many comparisons are needed to find the position of the letter to be inserted?

• In the worst case --- How many letters have to be shifted to make room for a new letter to be inserted?

• Are these the same cases?

Page 17: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

void insertletter(char alpharray[], char addlet, int& sizeofarr)

{

int i=0, endpos,newpos;

//find position for new letter

while (alpharray[i] < addlet && i < sizeofarr)

i++;

newpos =i;

//move chars over --- should check for full array first

for (i=sizeofarr; i>newpos; i--)

alpharray[i] = alpharray[i-1];

alpharray[newpos] = addlet; //insert new letter

sizeofarr++; //print out array

for(i=0; i<sizeofarr; i++) cout <<alpharray[i];

What happens if the array is full?

Can we use this code to insert elements into an empty list?

If (sizeofarr == 0) { alpharray[0] = addlet; sizeofarr++; return 0; }

Page 18: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Delete an element from a list

• Must find the element to delete:• Then move everything over

Page 19: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Delete

Let’s assume we are given the position of the item to delete in delpos;

DeleteElement(char alpharray[], int delpos, int& sizeofarr)

{

for (i=delpos+1; i<sizeofarr; i++)

alpharray[i-1] = alpharray[i];

sizeofarr--;

}

Page 20: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

ADT LIST:

• DONE: Insert element at end of a list; Insert element into previously sorted list

• TO DO: Sort List, Delete element, Create list, Find Element…..

Page 21: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

ADT: List

• Operation: sort.

• Given a list of unordered values in an array, sort the values so that they can be printed in sorted order.

Page 22: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

SIMPLE Sorting

• Sorting is a typical operation to put the elements in an array in order.

• Internal Sorts [for small data sets]selectionbubble (exchange)

• External Sorts [for large data sets]

Page 23: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Simple Sorting Selection sort

Find smallest element, andput at the head of the list, repeatwith remainder of list. The algorithm can also be formulated by finding the largest element and putting that at the head of the list

Page 24: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Selection Sort

index (k) sm_index

0 2swap 21, 9

1 1swap 13, 13

2 3swap 21, 15

3 4swap 21, 17

21 159 13 17

15 179 13 21

99 152121 13 17

15 21219 13 1717

2121 15159 13 17

Find smallest element, andput at the head of the list,repeatwith remainder of list

Scan 1

Scan 2

Scan 3

Scan 4

Page 25: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Selection Sort

const int size = 5;void sort(double [size]);void swap(double [size], int, int) // prototypes

int main(void){ int index;

double my_list[ ] = {21, 13, 9, 15, 17};

sort(my_list); // function call

cout<<"\nThe sorted array is: \n";for(index=0; index<size; index++)

cout<<'\t'<<my_list[index]<<endl;

…}

Page 26: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Let’s build up the algorithm

outer loop – array scans, each scan starts from the element after the previous scan

inner loop – find smallest element

swap smallest element with start of scan

next outer loop

Page 27: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Selection Sort

void sort(double testArray[]){ int n, k, sm_index, moves=0; double smallest;

for(k=0; k<size; k++) // size-1 = number of passes{

}}

smallest=testArray[k];sm_index=k;

swap(testArray, sm_index, k); // call to swap()

for(n=k+1; n<size; n++) if(testArray[n]<smallest) { smallest=testArray[n];

sm_index=n; }

Page 28: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Selection Sort

void swap(double testArray[], int smaller, int pass){ // pass = current position: k

double temp;

temp=testArray[pass];testArray[pass]=testArray[smaller];testArray[smaller]=temp;

}

Page 29: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

for(k=0; k<size; k++) // size-1 = number of passes{

}}

smallest=testArray[k];sm_index=k;

swap(testArray, sm_index, k); // call to swap()

for(n=k+1; n<size; n++) if(testArray[n]<smallest) { smallest=testArray[n];

sm_index=n; }

How many times is the inner if statement called?

How many times is the “sm_index” being reset?

How many times is the swap() function called?

Page 30: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

30

4.6 Sorting Arrays

• Sorting data– Important computing application

– Virtually every organization must sort some data • Massive amounts must be sorted

• Bubble sort (sinking sort) – Several passes through the array

– Successive pairs of elements are compared • If increasing order (or identical), no change

• If decreasing order, elements exchanged

– Repeat these steps for every element

Page 31: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

31

Simple SortingBubble sort

• As we scan the list swap elements out of order.• After the first scan, the largest element will be at

the end of the list. • Keep scanning the list until all of the elements are

in the correct place.

• Bubble sort – because the small elements bubble up to the top…..

Page 32: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

32

4.6 Sorting Arrays

• Example:– Go left to right, and exchange elements as necessary

• One pass for each element

– Original: 3 4 2 7 6

– Pass 1: 3 2 4 6 7 (elements exchanged)

– Pass 2: 2 3 4 6 7

– Pass 3: 2 3 4 6 7 (no changes needed)

– Pass 4: 2 3 4 6 7

– Pass 5: 2 3 4 6 7

– Small elements "bubble" to the top (like 2 in this example)

Page 33: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Bubble Sort

• Put smaller first

• Put smaller first

• No change

• Put smaller first21 252513 9 1717

2121 252513 9 17

99 252121 13 17

9 2513 21 17

Page 34: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Bubble Sort

• Begin again and put smaller first

• No change

• Put smaller first

21 179 13 25

17 21219 13 2525

2121 171313 9 25

2121 17179 13 25

Page 35: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Bubble Sort Example 2

• Begin --Put smaller first

• Put smaller first

• No change

• Put smaller first19 252518 13 1212

1919 252518 13 12

1313 251919 18 12

13 2518 19 12

Page 36: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Bubble Sort – Example 2

• Begin again and put smaller first

• No change

• Put smaller first

19 1213 18 25

12 191913 18 2525

1919 121818 13 25

1919 121213 18 25

Page 37: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

Bubble Sort – Example 2

• Begin again -- no change

• Swap – put smaller first

• Begin Again -- swap

• Sorted list

12 1913 18 25

18 191912 13 2525

1212 191313 18 25

1818 191913 12 25

Page 38: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

38

Let’s build up the algorithm – bubble sort

outer loop – array scans, each scan starts from the first element of the list until _________

inner loop

compare adjacent elements and swap

next outer loop

Page 39: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

39

4.6 Sorting Arrays

• Swapping variablesint x = 3, y = 4;

y = x;

x = y;

• What happened?– Both x and y are 3!

– Need a temporary variable

• Solutionint x = 3, y = 4, temp = 0;

temp = x; // temp gets 3

x = y; // x gets 4

y = temp; // y gets 3

Page 40: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline40

fig04_16.cpp(1 of 3)

1 // Fig. 4.16: fig04_16.cpp2 // This program sorts an array's values into ascending order.3 #include <iostream>4 5 using std::cout;6 using std::endl;7 8 #include <iomanip>9 10 using std::setw;11 12 int main()13 {14 const int arraySize = 10; // size of array a15 int a[ arraySize ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };16 int hold; // temporary location used to swap array elements17 18 cout << "Data items in original order\n";19 20 // output original array21 for ( int i = 0; i < arraySize; i++ )22 cout << setw( 4 ) << a[ i ];23

Page 41: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline41

fig04_16.cpp(2 of 3)

24 // bubble sort 25 // loop to control number of passes 26 for ( int pass = 0; pass < arraySize - 1; pass++ ) 27 28 // loop to control number of comparisons per pass 29 for ( int j = 0; j < arraySize - 1; j++ ) 30 31 // compare side-by-side elements and swap them if32 // first element is greater than second element 33 if ( a[ j ] > a[ j + 1 ] ) { 34 hold = a[ j ]; 35 a[ j ] = a[ j + 1 ]; 36 a[ j + 1 ] = hold; 37 38 } // end if 39

Do a pass for each element in the array.

If the element on the left (index j) is larger than the element on the right (index j + 1), then we swap them. Remember the need of a temp variable.

Page 42: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline42

fig04_16.cpp(3 of 3)

fig04_16.cppoutput (1 of 1)

40 cout << "\nData items in ascending order\n";41 42 // output sorted array43 for ( int k = 0; k < arraySize; k++ )44 cout << setw( 4 ) << a[ k ];45 46 cout << endl;47 48 return 0; // indicates successful termination49 50 } // end main

Data items in original order

2 6 4 8 10 12 89 68 45 37

Data items in ascending order

2 4 6 8 10 12 37 45 68 89

Page 43: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

43

Can we improve the algorithm?

• In the first example, we did not have to keep scanning the list since the list was sorted after the “2nd” scan……

Check to see if any swaps were performed on the previous inner loop. If none were performed do not scan the list anymore since it is sorted. ---- WE CAN END THE ALGORITHM EARLY: EARLY TERMINATION how can we accomplish this?

Page 44: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline44

24 // bubble sort 25 int flag = 1; 26 for ( int pass = 0; (pass < arraySize – 1) && flag; pass++ ) 27 flag = 0; 28 // loop to control number of comparisons per pass 29 for ( int j = 0; j < arraySize - 1; j++ ) 30 31 // compare side-by-side elements and swap them if32 // first element is greater than second element 33 if ( a[ j ] > a[ j + 1 ] ) { 34 hold = a[ j ]; 35 a[ j ] = a[ j + 1 ]; • a[ j + 1 ] = hold; • flag = 1; //set flag since swap occurred

37 38 } // end if 39

Bubble sort with early termination

Possible early termination

Page 45: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline45

24 // bubble sort 25 // loop to control number of passes 26 for ( int pass = 0; pass < arraySize - 1; pass++ ) 27 28 // loop to control number of comparisons per pass 29 for ( int j = 0; j < arraySize - 1; j++ ) 30 31 // compare side-by-side elements and swap them if32 // first element is greater than second element 33 if ( a[ j ] > a[ j + 1 ] ) { 34 hold = a[ j ]; 35 a[ j ] = a[ j + 1 ]; 36 a[ j + 1 ] = hold; 37 38 } // end if 39

How many times does the outer loop execute in the worst case?

How many times is the swap performed (inner loop) in the worst case?

Page 46: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

46

ADT LIST

So far we have seen the following operations on a “list”:

• Adding an element• Deleting an element• Sorting the list for display• Computing statistics on a list of numeric values Last operation Finding an element in a list

Page 47: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

47

Finding an element is important:

• FOR DELETION: usually you must “find” the element before deleting it….

• FOR INSERTION: must find the place to insert an element (if not in alphabetic order)….

• TO PRINT: i.e., find students name & print grade

Page 48: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

48

4.8 Searching Arrays: Linear Search and

• Search array for a key value• Linear search

– Key value is the value to be searched for. It is usually inputted by the user.

– Compare each element of array with key value• Start at one end, go to other

• If the element is found, return the index number of the array. Remember --- we do not usually need to return the value, we know the value since it is what we were searching for. We need to know the POSITION of the value, i.e., its index.

Page 49: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

49

SEARCHING

Finding an element in an array

Example: Given an array which contains a list of

integers, find the index of a particular integer.

10 24 3 5 6 7 100 4 32 65 8

index of 24 is 1index of 100 is 6index of 35 is NOT FOUND

0 1 2 3 4 5 6 7 8 9 10

Page 50: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline50

fig04_19.cpp(1 of 2)

1 // Fig. 4.19: fig04_19.cpp2 // Linear search of an array.3 #include <iostream>4 5 using std::cout;6 using std::cin;7 using std::endl;8 9 int linearSearch( const int [], int, int ); // prototype10 11 int main()12 {13 const int arraySize = 100; // size of array a14 int a[ arraySize ]; // create array a15 int searchKey; // value to locate in a16 17 for ( int i = 0; i < arraySize; i++ ) // create some data18 a[ i ] = 2 * i;19 20 cout << "Enter integer search key: ";21 cin >> searchKey;22 23 // attempt to locate searchKey in array a 24 int element = linearSearch( a, searchKey, arraySize );25

Takes array, search key, and array size.

Page 51: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline51

fig04_19.cpp(2 of 2)

26 // display results27 if ( element != -1 )28 cout << "Found value in element " << element << endl;29 else30 cout << "Value not found" << endl;31 32 return 0; // indicates successful termination33 34 } // end main35 36 // compare key to every element of array until location is 37 // found or until end of array is reached; return subscript of 38 // element if key or -1 if key not found 39 int linearSearch( const int array[], int key, int sizeOfArray )40 { 41 for ( int j = 0; j < sizeOfArray; j++ ) 42 43 if ( array[ j ] == key ) // if found, 44 return j; // return location of key 45 46 return -1; // key not found 47 48 } // end function linearSearch

Page 52: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline52

fig04_19.cppoutput (1 of 1)

Enter integer search key: 36

Found value in element 18

Enter integer search key: 37

Value not found

Page 53: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

53

Linear Search Analysis

In the worst case, how many elements have to be compared?

int linearSearch( const int array[], int key, int sizeOfArray )

40 {

41 for ( int j = 0; j < sizeOfArray; j++ )

42

43 if ( array[ j ] == key ) // if found,

44 return j; // return location of key

45

46 return -1; // key not found

47

48 } // end function linearSearch

Page 54: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

54

Analysis

• IF an element is not in the array, all of the elements in the array have to be checked to determine that a particular element is not there.

• FOR EXAMPLE: if there are 10 elements in the array, 10 comparisons have to be made in the worst case. Therefore, if there are n elements in the array...

n comparisons have to be made in the worst case

Page 55: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

55

What if the array were already sorted?

Search for an element in a sorted array.

1 3 4 7 29 45 69 100 134 156

Do we have to check all of the elements if we know something about the order of the array?

No -- we can search until we know the element cannot appear anymore, i.e. array[j] > target. However in the worst case the # of comparisons is

still the number of elements in the array, I.e. we have to check all of the elements in the array

Page 56: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

56

Better Linear Search for Sorted Array

“Early termination” ---int linearSearchSorted( const int array[], int key, int sizeOfArray )

40 {

41 int j = 0;

42 while ( j < sizeOfArray-1 && key < array[j])

43 j++ ;

44

42

43 if ( array[ j ] == key ) // if found,

44 return j; // return location of key

45

46 return -1; // key not found

47

48 } // end function linearSearch

Page 57: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

57

How to use a telephone book

Page 58: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

58

To find the name “Randy Jackson”you would not start with Aardvarkand continue until you hit the name...

Page 59: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

59

start Input item;set lower index to zeroset upper index to size-1

While lower index < upper index Return -1

Calculate midpoint

Item == midpoint? Return index

Item > midpoint

Set upper index to midpoint-1

no

yes

Set lower index to midpoint + 1

no

yes

no

Lo

op

un

til

fou

nd

/no

t fo

un

d

Page 60: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

60

1 3 4 7 29 45 69 100 134 156 200

0 1 2 3 4 5 6 7 8 9 10

Midpoint low high

Example 1: Looking for the number 140

Midpoint highlow

0 1 2 3 4 5 6 7 8 9 10

lowMidpoint

high

0 1 2 3 4 5 6 7 8 9

high low

0 1 2 3 4 5 6 7 8 9 10

How many comparisons? 3

Page 61: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

61

1 3 4 7 29 45 69 100 134 156 200

0 1 2 3 4 5 6 7 8 9 10

Midpoint low high

Example 1: Looking for the number 7

Midpoint highlow

0 1 2 3 4 5 6 7 8 9 10

lowMidpoint

high

0 1 2 3 4 5 6 7 8 9 10

How many comparisons? 3

Page 62: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline62

fig04_20.cpp(1 of 6)

1 // Fig. 4.20: fig04_20.cpp2 // Binary search of an array.3 #include <iostream>4 5 using std::cout;6 using std::cin;7 using std::endl;8 9 #include <iomanip>10 11 using std::setw;12 13 // function prototypes14 int binarySearch( const int [], int, int, int, int );15 void printHeader( int );16 void printRow( const int [], int, int, int, int );17 18 int main()19 {20 const int arraySize = 15; // size of array a21 int a[ arraySize ]; // create array a22 int key; // value to locate in a23 24 for ( int i = 0; i < arraySize; i++ ) // create some data25 a[ i ] = 2 * i; 26

Page 63: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline63

fig04_20.cpp(2 of 6)

27 cout << "Enter a number between 0 and 28: ";28 cin >> key;29 30 printHeader( arraySize );31 32 // search for key in array a33 int result = 34 binarySearch( a, key, 0, arraySize - 1, arraySize );35 36 // display results37 if ( result != -1 )38 cout << '\n' << key << " found in array element "39 << result << endl;40 else41 cout << '\n' << key << " not found" << endl;42 43 return 0; // indicates successful termination44 45 } // end main46

Page 64: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline64

fig04_20.cpp(3 of 6)

47 // function to perform binary search of an array48 int binarySearch( const int b[], int searchKey, int low, 49 int high, int size )50 {51 int middle;52 53 // loop until low subscript is greater than high subscript54 while ( low <= high ) {55 56 // determine middle element of subarray being searched57 middle = ( low + high ) / 2; 58 59 // display subarray used in this loop iteration60 printRow( b, low, middle, high, size );61

Determine middle element

Page 65: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline65

62 // if searchKey matches middle element, return middle63 if ( searchKey == b[ middle ] ) // match64 return middle;65 66 else 67 68 // if searchKey less than middle element, 69 // set new high element70 if ( searchKey < b[ middle ] )71 high = middle - 1; // search low end of array72 73 // if searchKey greater than middle element, 74 // set new low element75 else76 low = middle + 1; // search high end of array77 }78 79 return -1; // searchKey not found80 81 } // end function binarySearch

Use the rule of binary search:If key equals middle, match

If less, search low end

If greater, search high end

Loop sets low, middle and high dynamically. If searching the high end, the new low is the element above the middle.

while ( low <= high ) {

55

56 // determine middle element of subarray being searched

57 middle = ( low + high ) / 2;

58

59 // display subarray used in this loop iteration

60 printRow( b, low, middle, high, size );

Page 66: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline66

fig04_20.cpp(5 of 6)

82 83 // print header for output84 void printHeader( int size )85 {86 cout << "\nSubscripts:\n";87 88 // output column heads89 for ( int j = 0; j < size; j++ )90 cout << setw( 3 ) << j << ' ';91 92 cout << '\n'; // start new line of output93 94 // output line of - characters95 for ( int k = 1; k <= 4 * size; k++ )96 cout << '-';97 98 cout << endl; // start new line of output99 100 } // end function printHeader101

Page 67: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline67

fig04_20.cpp(6 of 6)

102 // print one row of output showing the current103 // part of the array being processed104 void printRow( const int b[], int low, int mid, 105 int high, int size )106 {107 // loop through entire array108 for ( int m = 0; m < size; m++ )109 110 // display spaces if outside current subarray range111 if ( m < low || m > high )112 cout << " ";113 114 // display middle element marked with a *115 else 116 117 if ( m == mid ) // mark middle value118 cout << setw( 3 ) << b[ m ] << '*'; 119 120 // display other elements in subarray121 else122 cout << setw( 3 ) << b[ m ] << ' ';123 124 cout << endl; // start new line of output125 126 } // end function printRow

Page 68: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline68

fig04_20.cppoutput (1 of 2)

 

Enter a number between 0 and 28: 6

 

Subscripts:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

------------------------------------------------------------

0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28

0 2 4 6* 8 10 12

 

6 found in array element 3

 

 

 

Enter a number between 0 and 28: 25

 

Subscripts:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

------------------------------------------------------------

0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28

16 18 20 22* 24 26 28

24 26* 28

24*

 

25 not found

Page 69: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline69

fig04_20.cppoutput (2 of 2)

Enter a number between 0 and 28: 8

 

Subscripts:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

------------------------------------------------------------

0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28

0 2 4 6* 8 10 12

8 10* 12

8*

 

8 found in array element 4

Page 70: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

70

SEARCH ALGORITHM BEST CASE WORST CASE

Linear Search Entire array1

Binary Search 1

The number of times you can divide the array by 2

= log2(#elems_in_array)

*******

Sorted array:

Page 71: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

71

What does log2 mean?

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Z elements

xxxxxxxxxxxxxxxxxxxxxxxx

Z/2 elements

xxxxxxxxxxx

Z/2/2 elements

xxxxxx

Z/2/2/2 elements

Z22

Z23

Z2x

=1?

Log2 z = x

x is the number of times I can keep splitting the list until there is only 1 element left

Page 72: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

72

Powers of 2

Below are tables for the power 2x

x2x

1 2 3 4 5 6 7 8 9 10 11 12 13

2 4 8 16 32 64 128 256 512 1024 2048 4096 8192

14 15 16 17 18 19 20 21 22

16384 32768 65536 131072 262144 524288 1048576 2097152 4194304

Page 73: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

73

SEARCH ALGORITHM BEST CASE WORST CASE

Linear Search n1

Binary Search 1 Log2(n)

For an ORDERED array of n elements

Page 74: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

74

SEARCH ALGORITHM BEST CASE WORST CASE

Linear Search n1

Binary Search

What about an unsorted array?

NOT APPLICABLE

Page 75: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc. All rights reserved.

75

4.7 Case Study: Computing Mean, Median and Mode Using Arrays

• Mean– Average (sum/number of elements)

• Median– Number in middle of sorted list

– 1, 2, 3, 4, 5 (3 is median)

– If even number of elements, take average of middle two

• Mode– Number that occurs most often

– 1, 1, 1, 2, 3, 3, 4, 5 (1 is mode)

Page 76: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline76

fig04_17.cpp(1 of 8)

1 // Fig. 4.17: fig04_17.cpp2 // This program introduces the topic of survey data analysis.3 // It computes the mean, median, and mode of the data.4 #include <iostream>5 6 using std::cout;7 using std::endl;8 using std::fixed;9 using std::showpoint;10 11 #include <iomanip>12 13 using std::setw;14 using std::setprecision;15 16 void mean( const int [], int );17 void median( int [], int );18 void mode( int [], int [], int );19 void bubbleSort( int[], int );20 void printArray( const int[], int );21 22 int main()23 {24 const int responseSize = 99; // size of array responses25

Page 77: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline77

fig04_17.cpp(2 of 8)

26 int frequency[ 10 ] = { 0 }; // initialize array frequency27 28 // initialize array responses29 int response[ responseSize ] = 30 { 6, 7, 8, 9, 8, 7, 8, 9, 8, 9,31 7, 8, 9, 5, 9, 8, 7, 8, 7, 8,32 6, 7, 8, 9, 3, 9, 8, 7, 8, 7,33 7, 8, 9, 8, 9, 8, 9, 7, 8, 9,34 6, 7, 8, 7, 8, 7, 9, 8, 9, 2,35 7, 8, 9, 8, 9, 8, 9, 7, 5, 3,36 5, 6, 7, 2, 5, 3, 9, 4, 6, 4,37 7, 8, 9, 6, 8, 7, 8, 9, 7, 8,38 7, 4, 4, 2, 5, 3, 8, 7, 5, 6,39 4, 5, 6, 1, 6, 5, 7, 8, 7 };40 41 // process responses42 mean( response, responseSize );43 median( response, responseSize );44 mode( frequency, response, responseSize );45 46 return 0; // indicates successful termination47 48 } // end main49

Page 78: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline78

fig04_17.cpp(3 of 8)

50 // calculate average of all response values51 void mean( const int answer[], int arraySize )52 {53 int total = 0;54 55 cout << "********\n Mean\n********\n";56 57 // total response values58 for ( int i = 0; i < arraySize; i++ )59 total += answer[ i ];60 61 // format and output results62 cout << fixed << setprecision( 4 );63 64 cout << "The mean is the average value of the data\n"65 << "items. The mean is equal to the total of\n"66 << "all the data items divided by the number\n"67 << "of data items (" << arraySize 68 << "). The mean value for\nthis run is: " 69 << total << " / " << arraySize << " = "70 << static_cast< double >( total ) / arraySize 71 << "\n\n";72 73 } // end function mean74

We cast to a double to get decimal points for the average (instead of an integer).

Page 79: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline79

fig04_17.cpp(4 of 8)

75 // sort array and determine median element's value76 void median( int answer[], int size )77 {78 cout << "\n********\n Median\n********\n"79 << "The unsorted array of responses is";80 81 printArray( answer, size ); // output unsorted array82 83 bubbleSort( answer, size ); // sort array84 85 cout << "\n\nThe sorted array is";86 printArray( answer, size ); // output sorted array 87 88 // display median element89 cout << "\n\nThe median is element " << size / 290 << " of\nthe sorted " << size 91 << " element array.\nFor this run the median is "92 << answer[ size / 2 ] << "\n\n";93 94 } // end function median95

Sort array by passing it to a function. This keeps the program modular.

Page 80: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline80

fig04_17.cpp(5 of 8)

96 // determine most frequent response97 void mode( int freq[], int answer[], int size )98 {99 int largest = 0; // represents largest frequency100 int modeValue = 0; // represents most frequent response101 102 cout << "\n********\n Mode\n********\n";103 104 // initialize frequencies to 0105 for ( int i = 1; i <= 9; i++ )106 freq[ i ] = 0;107 108 // summarize frequencies109 for ( int j = 0; j < size; j++ )110 ++freq[ answer[ j ] ];111 112 // output headers for result columns113 cout << "Response" << setw( 11 ) << "Frequency"114 << setw( 19 ) << "Histogram\n\n" << setw( 55 )115 << "1 1 2 2\n" << setw( 56 )116 << "5 0 5 0 5\n\n";117

Page 81: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline81

fig04_17.cpp(6 of 8)

118 // output results119 for ( int rating = 1; rating <= 9; rating++ ) {120 cout << setw( 8 ) << rating << setw( 11 )121 << freq[ rating ] << " ";122 123 // keep track of mode value and largest fequency value124 if ( freq[ rating ] > largest ) { 125 largest = freq[ rating ]; 126 modeValue = rating; 127 128 } // end if 129 130 // output histogram bar representing frequency value131 for ( int k = 1; k <= freq[ rating ]; k++ )132 cout << '*';133 134 cout << '\n'; // begin new line of output135 136 } // end outer for137 138 // display the mode value139 cout << "The mode is the most frequent value.\n"140 << "For this run the mode is " << modeValue141 << " which occurred " << largest << " times." << endl;142 143 } // end function mode

The mode is the value that occurs most often (has the highest value in freq).

Page 82: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline82

fig04_17.cpp(7 of 8)

144 145 // function that sorts an array with bubble sort algorithm146 void bubbleSort( int a[], int size )147 {148 int hold; // temporary location used to swap elements149 150 // loop to control number of passes151 for ( int pass = 1; pass < size; pass++ )152 153 // loop to control number of comparisons per pass154 for ( int j = 0; j < size - 1; j++ )155 156 // swap elements if out of order157 if ( a[ j ] > a[ j + 1 ] ) {158 hold = a[ j ];159 a[ j ] = a[ j + 1 ];160 a[ j + 1 ] = hold;161 162 } // end if163 164 } // end function bubbleSort165

Page 83: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline83

fig04_17.cpp(8 of 8)

166 // output array contents (20 values per row)167 void printArray( const int a[], int size )168 {169 for ( int i = 0; i < size; i++ ) {170 171 if ( i % 20 == 0 ) // begin new line every 20 values172 cout << endl;173 174 cout << setw( 2 ) << a[ i ];175 176 } // end for177 178 } // end function printArray

Page 84: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline84

fig04_17.cppoutput (1 of 2)

********

Mean

********

The mean is the average value of the data

items. The mean is equal to the total of

all the data items divided by the number

of data items (99). The mean value for

this run is: 681 / 99 = 6.8788

********

Median

********

The unsorted array of responses is

6 7 8 9 8 7 8 9 8 9 7 8 9 5 9 8 7 8 7 8

6 7 8 9 3 9 8 7 8 7 7 8 9 8 9 8 9 7 8 9

6 7 8 7 8 7 9 8 9 2 7 8 9 8 9 8 9 7 5 3

5 6 7 2 5 3 9 4 6 4 7 8 9 6 8 7 8 9 7 8

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

 

The sorted array is

1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 5

5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7

7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9

 

The median is element 49 of

the sorted 99 element array.

For this run the median is 7

Page 85: Using Arrays in Abstract Data Types

2003 Prentice Hall, Inc.All rights reserved.

Outline85

fig04_17.cppoutput (2 of 2)

********

Mode

********

Response Frequency Histogram

 

1 1 2 2

5 0 5 0 5

 

1 1 *

2 3 ***

3 4 ****

4 5 *****

5 8 ********

6 9 *********

7 23 ***********************

8 27 ***************************

9 19 *******************

The mode is the most frequent value.

For this run the mode is 8 which occurred 27 times.