760 likes | 774 Views
Using Arrays in Abstract Data Types. What is an Abstract Data Type. A built-in data type is an int, float, double, etc.
E N D
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.
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…. WHAT ARE BASIC OPERATIONS ON A LIST? 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
Grocery items: Chips Salsa Coke Tissues Sprite Jelly beans Grocery items: Chips Salsa Coke Tissues Sprite Jelly beans Beer Grocery items: Chips Salsa Coke Sprite Jelly beans Beer Grocery items: Beer Chips Coke Jelly beans Salsa Sprite Original list Delete tissues Sort alphabetically Add Beer Grocery items: Beer Coke Sprite Jelly beans Chips Salsa Sort by grocery aisles 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) Is beer on the list?
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……….
B J K M S Z Let’s make a simpler list • Instead of strings, we will have a list of letters const int MAXCHARS = 8; char alpharray[MAXCHARS]; 0 1 2 3 4 5 6 7
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];
B J K M S Z B J K M S Z L Insert an element into an array • Simple insert routine: find end of array, insert element: alpharray[endofarray] = newelement; endofarray++; Before: After inserting L
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?
B J K M S Z B J K L M S Z INSERTING INTO A ARRAY BASED Alphabetical LIST 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 correctalphabetical order in the alphabet array. alphabet [0] [1] [2] [3] [4] [5] [6] [7] …... Before: After adding ‘L’
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 ****
#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…..
Find position for new letter //find position for new letter while (alpharray[i] < addlet && i < sizeofarray) i++; newpos =i;
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];
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]; }
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?
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]; If (sizeofarr == 0) { alpharray[0] = addlet; sizeofarr++; return 0; } What happens if the array is full? Can we use this code to insert elements into an empty list?
Delete an element from a list • Must find the element to delete: • Then move everything over
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--; }
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…..
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.
SIMPLE Sorting • Sorting is a typical operation to put the elements in an array in order. • Internal Sorts [for small data sets] selection bubble (exchange) • External Sorts [for large data sets]
Simple Sorting Selection sort Find smallest element, and put at the head of the list, repeat with remainder of list. The algorithm can also be formulated by finding the largest element and putting that at the head of the list
Find smallest element, and put at the head of the list,repeat with remainder of list 21 13 9 15 17 9 13 21 15 17 9 13 21 15 17 9 13 15 21 17 9 13 15 17 21 Selection Sort index (k) sm_index 0 2 swap 21, 9 1 1 swap 13, 13 2 3 swap 21, 15 3 4 swap 21, 17 Scan 1 Scan 2 Scan 3 Scan 4
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; … }
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
Find Minimum void minimum(double testArray[], int k) { int j, sm_index; double smallest; // find the minimum from the k-th to the end in testArray[] } } smallest=testArray[k]; //value of the smallest sm_index=k; //index of the smallest …… for(j=k+1; j<size; j++) if(testArray[j]<smallest) { smallest=testArray[j]; sm_index=j; }
Selection Sort void sort(double testArray[]) { int j, k, sm_index; double smallest; for(k=0; k<size-1; k++) // size-1 = number of passes { } } smallest=testArray[k]; sm_index=k; swap(testArray, sm_index, k); // call to swap() for(j=k+1; j<size; j++) if(testArray[j]<smallest) { smallest=testArray[j]; sm_index=j; }
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; }
for(k=0; k<size-1; k++) // size-1 = number of passes { } } smallest=testArray[k]; sm_index=k; swap(testArray, sm_index, k); // call to swap() for(j=k+1; j<size; j++) if(testArray[j]<smallest) { smallest=testArray[j]; sm_index=j; } 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?
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
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…..
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 46 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)
21 13 9 25 17 13 21 9 25 17 13 9 21 25 17 13 9 21 25 17 Bubble Sort • Put smaller first • Put smaller first • No change • Put smaller first
13 9 21 17 25 9 13 21 17 25 9 13 21 17 25 9 13 17 21 25 Bubble Sort • Begin again and put smaller first • No change • Put smaller first
19 18 13 25 12 18 19 13 25 12 18 13 19 25 12 18 13 19 25 12 Bubble Sort Example 2 • Begin --Put smaller first • Put smaller first • No change • Put smaller first
18 13 19 12 25 13 18 19 12 25 13 18 19 12 25 13 18 12 19 25 Bubble Sort – Example 2 • Begin again and put smaller first • No change • Put smaller first
13 18 12 19 25 13 18 12 19 25 13 12 18 19 25 12 13 18 19 25 Bubble Sort – Example 2 • Begin again -- no change • Swap – put smaller first • Begin Again -- swap • Sorted list
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
4.6 Sorting Arrays • Swapping variables int x = 3, y = 4; y = x; x = y; • What happened? • Both x and y are 3! • Need a temporary variable • Solution int x = 3, y = 4, temp = 0; temp = x; // temp gets 3 x = y; // x gets 4 y = temp; // y gets 3
1 // Fig. 4.16: fig04_16.cpp 2 // 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 intarraySize = 10; // size of array a 15 int a[ arraySize ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; 16 int hold; // temporary location used to swap array elements 17 18 cout << "Data items in original order\n"; 19 20 // output original array 21 for ( int i = 0; i < arraySize; i++ ) 22 cout << setw( 4 ) << a[ i ]; 23 fig04_16.cpp(1 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 - pass; j++ ) 30 31 // compare side-by-side elements and swap them if 32 // 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. fig04_16.cpp(2 of 3)
40 cout << "\nData items in ascending order\n"; 41 42 // output sorted array 43 for ( int k = 0; k < arraySize; k++ ) 44 cout << setw( 4 ) << a[ k ]; 45 46 cout << endl; 47 48 return0; // indicates successful termination 49 50 } // end main fig04_16.cpp(3 of 3)fig04_16.cppoutput (1 of 1) 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
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?
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 - pass; j++ ) 30 31 // compare side-by-side elements and swap them if 32 // 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 Possible early termination Bubble sort with early termination
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 - pass; j++ ) 30 31 // compare side-by-side elements and swap them if 32 // 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?
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 operationFinding an element in a list
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
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.
SEARCHING Finding an element in an array Example: Given an array which contains a list of integers, find the index of a particular integer. 0 1 2 3 4 5 6 7 8 9 10 10 24 3 5 6 7 100 4 32 65 8 index of 24 is 1 index of 100 is 6 index of 35 is NOT FOUND