Source of Listing11-1.cpp


  1: //  Created by Frank M. Carrano and Timothy M. Henry.
  2: //  Copyright (c) 2017 Pearson Education, Hoboken, New Jersey.

  4: // Listing 11-1.

  6: /** Finds the largest item in an array.
  7:  @pre  The size of the array is >= 1.
  8:  @post  The arguments are unchanged.
  9:  @param theArray  The given array.
 10:  @param size  The number of elements in theArray.
 11:  @return  The index of the largest entry in the array. */
 12: template <class ItemType>
 13: int findIndexOfLargest(const ItemType theArray[], int size);
 14: /** Sorts the items in an array into ascending order.
 15:  @pre  None.
 16:  @post  The array is sorted into ascending order; the size of the array
 17:     is unchanged.
 18:  @param theArray  The array to sort.
 19:  @param n  The size of theArray. */
 20: template <class ItemType>
 21: void selectionSort(ItemType theArray[], int n)
 22: {
 23:    // last = index of the last item in the subarray of items yet
 24:    //        to be sorted;
 25:    // largest = index of the largest item found
 26:    for (int last = n − 1; last >= 1; last––)
 27:    {
 28:       // At this point, theArray[last+1..n–1] is sorted, and its
 29:       // entries are greater than those in theArray[0..last].
 30:       // Select the largest entry in theArray[0..last]
 31:       int largest = findIndexOfLargest(theArray, last+1);
 32:       
 33:       // Swap the largest entry, theArray[largest], with
 34:       // theArray[last]
 35:       std::swap(theArray[largest], theArray[last]);
 36:    } // end for
 37: }  // end selectionSort

 39: template <class ItemType>
 40: int findIndexOfLargest(const ItemType theArray[], int size)
 41: {
 42:    int indexSoFar = 0; // Index of largest entry found so far
 43:    for (int currentIndex = 1; currentIndex < size; currentIndex++)
 44:    {
 45:       // At this point, theArray[indexSoFar] >= all entries in
 46:       // theArray[0..currentIndex − 1]
 47:       if (theArray[currentIndex] > theArray[indexSoFar])
 48:          indexSoFar = currentIndex;
 49:    }  // end for
 50:    
 51:    return indexSoFar; // Index of largest entry
 52: }  // end findIndexOfLargest