/* sorting.cpp * * Array Sorting program. Uses Bubble and Selection sorts * to sort an array. * * Bruce M. Bolden * November 7, 1997 * * http://www.cs.uidaho.edu/~bruceb/ * * --------------------------------------------------------- */ #include #include #include #include #include // uncomment if your compiler does not define TRUE/FALSE // necessary for g++ const int TRUE = 1; const int FALSE = 0; // Prototypes void OpenFiles( ifstream& fIn, ofstream& fOut ); int ReadArray( ifstream& fIn, int A[], const int nMax ); void WriteArray( ofstream& fOut, const int A[], const int nMax ); void WriteArrayRow( ofstream& fOut, const int A[], const int nMax ); void InitializeArray( int A[], const int nMax, const int iVal ); void CopyArray( int aFrom[], int aTo[], const int nMax ); int MinArray( const int A[], const int nMax ); // normally wouldn't pass a file stream to a sorting function void BubbleSort( ofstream& fOut, int A[], const int nA ); void SelectionSort( ofstream& fOut, int A[], const int nA ); int SearchArray( const int A[], const int nMax, const int keyVal ); int main() { const int MAX_ELEMENTS = 10; int iArray[MAX_ELEMENTS]; int iArray2[MAX_ELEMENTS]; int n; // number of elements in the array int index; // location of element in the array ifstream fIn; // file streams ofstream fOut; OpenFiles( fIn, fOut ); // Read the array to be sorted n = ReadArray( fIn, iArray, MAX_ELEMENTS ); fIn.close(); // done---close it! fOut << "Contents of iArray:\n"; WriteArrayRow( fOut, iArray, n ); // save original array for later use CopyArray( iArray, iArray2, n ); fOut << "Contents of iArray2:\n"; WriteArrayRow( fOut, iArray2, n ); fOut << "\n\nMinimum value of iArray: "; int aMin = MinArray( iArray, n ); fOut << aMin << endl; fOut << "\nSearching for 1" << endl; index = SearchArray( iArray, n, 1 ); fOut << "\tindex: " << index << endl; // Sort the array fOut << "\nCalling BubbleSort()\n"; BubbleSort( fOut, iArray, n ); fOut << "Array contents after Calling BubbleSort()\n"; WriteArrayRow( fOut, iArray, n ); fOut << "\nSearching for 1" << endl; index = SearchArray( iArray, n, 1 ); fOut << "\tindex: " << index << endl; // restore original array, then sort it CopyArray( iArray2, iArray, n ); fOut << "\nSearching for 1" << endl; index = SearchArray( iArray, n, 1 ); fOut << "\tindex: " << index << endl; fOut << "\nCalling SelectionSort()\n"; SelectionSort( fOut, iArray, n ); fOut << "Array contents after Calling SelectionSort()\n"; WriteArrayRow( fOut, iArray, n ); fOut << "\nSearching for 1" << endl; index = SearchArray( iArray, n, 1 ); fOut << "\tindex: " << index << endl; fOut.close(); return 0; } // ------------------------------------------------------------------ /* OpenFiles * * Open input and output file streams */ void OpenFiles( ifstream& fIn, ofstream& fOut ) { fIn.open( "array.dat", ios::in | ios::nocreate ); if( !fIn ) { cerr << "Unable to open input file: \"array.dat\"" << endl; exit( -1 ); } fOut.open( "sorting.out", ios::out ); if( !fOut ) { cerr << "Unable to open output file: \"sorting.out\"" << endl; exit( -1 ); } } // ------------------------------------------------------------------ /* ReadArray * * Reads array elements. */ int ReadArray( ifstream& fIn, int A[], const int nMax ) { int i = 0; int nTmp; while( (i < nMax) && (fIn >> nTmp) ) { A[i] = nTmp; ++i; } return i; // number of elements stored } /* WriteArray * * Writes one element to a line. */ void WriteArray( ofstream& fOut, const int A[], const int nMax ) { for( int i = 0 ; i < nMax ; i++ ) { fOut << A[i] << endl; } } /* WriteArrayRow * * Writes all elements on a line. */ void WriteArrayRow( ofstream& fOut, const int A[], const int nMax ) { for( int i = 0 ; i < nMax ; i++ ) { fOut << setw(4) << A[i]; } fOut << endl; } /* InitializeArray * * Initializes array elements to a programmer defined value. */ void InitializeArray( int A[], const int nMax, const int iVal ) { for( int i = 0 ; i < nMax ; i++ ) A[i] = iVal; } /* CopyArray * * Copies array elements from one array to another. */ void CopyArray( int aFrom[], int aTo[], const int nMax ) { for( int i = 0 ; i < nMax ; i++ ) aTo[i] = aFrom[i]; } /* MinArray * * Finds the minimum value in an array. */ int MinArray( const int A[], const int nMax ) { int min = A[0]; for( int i = 1 ; i < nMax ; i++ ) { if( A[i] < min ) min = A[i]; } return min; } // ------------------------------------------------------------------ /* BubbleSort * * Perform a bubble sort on an array. */ void BubbleSort( ofstream& fOut, int A[], const int nA ) { int iTmp; int swapFlag = TRUE; fOut << "\nIn BubbleSort():" << endl; fOut << "Pass Array Contents" << endl; for( int i = 0 ; i < nA && swapFlag == TRUE ; i++ ) { swapFlag = FALSE; for( int j = 0 ; j < nA - i - 1 ; j++ ) { if( A[j] > A[j+1] ) // swap them { swapFlag = TRUE; //Swap( A[j], A[j+1] ); iTmp = A[j]; A[j] = A[j+1]; A[j+1] = iTmp; } } fOut << setw(3) << i+1; // pass number WriteArrayRow( fOut, A, nA ); } fOut << "Leaving BubbleSort()\n" << endl; } /* SelectionSort * * Perform a selection sort on an array */ void SelectionSort( ofstream& fOut, int A[], const int nA ) { fOut << "\nIn SelectionSort():" << endl; fOut << "Pass Array Contents" << endl; for( int i = 0 ; i < nA - 1 ; ++i ) { int low = i; for( int j = i + 1 ; j < nA ; ++j ) { if( A[j] < A[low] ) low = j; } if( i != low ) // swap them { int iTmp; //Swap( A[low], A[i] ); iTmp = A[low]; A[low] = A[i]; A[i] = iTmp; } fOut << setw(3) << i+1; // pass number WriteArrayRow( fOut, A, nA ); } fOut << "Leaving SelectionSort()\n" << endl; } // ------------------------------------------------------------------ /* SearchArray * * Searches for the value, keyVal, in an array. * If successful, the index is returned. * If unsuccessful, -1 is returned. */ int SearchArray( const int A[], const int nMax, const int keyVal ) { for( int i = 0 ; i < nMax ; i++ ) { if( A[i] == keyVal ) return i; } return -1; } // ------------------------------------------------------------------