/*$T Fig08_20.cpp GC 1.140 04/10/12 15:37:25 */
/* Multipurpose sorting program using function pointers. */
#include <iostream>
#include <iomanip>
using namespace std;
/* prototypes */
void selectionSort(int[], const int, bool(*) (int, int));
void swap(int *const, int *const);
bool ascending(int, int); /* implements ascending order */
bool descending(int, int); /* implements descending order */
/*
=======================================================================================================================
2012.04.10 By KeKe
=======================================================================================================================
*/
void main()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
const int arraySize = 10;
int order; /* 1= ascending,2= descending */
int counter; /* array index */
int a[arraySize] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
cout << "Enter 1 to sort in ascending order,\n" << "Enter 2 to sort in descending order: ";
cin >> order;
cout << "\nData items in originalorder\n";
/* output original array */
for(counter = 0; counter < arraySize; ++counter) cout << setw(4) << a[counter];
/*
* sort array in ascending order;
* passfunction ascending ;
* as an argument to specify ascending sorting order
*/
if(order == 1)
{
selectionSort(a, arraySize, ascending);
cout << "\nData items in ascending order\n";
} /* end if */
/*
* sort array in descending order;
* pass function descending ;
* as an argument to specify descending sorting order
*/
else
{
selectionSort(a, arraySize, descending);
cout << "\nData items in descending order\n";
} /* end else part of if...else */
/* output sorted array */
for(counter = 0; counter < arraySize; ++counter) cout << setw(4) << a[counter];
cout << endl;
} /* end main */
/*
=======================================================================================================================
multipurpose selection sort;
the parameter compare is a pointer to ;
the comparison function that determines the sorting order
=======================================================================================================================
*/
void selectionSort(int work[], const int size, bool (*compare) (int, int))
{
int smallestOrLargest; /* index of smallest (orlargest) element */
/* loop over size -1 elements */
for(int i = 0; i < size - 1; ++i)
{
smallestOrLargest = i; /* first index of remaining vector */
/* loop to find index of smallest (or largest) element */
for(int index = i + 1; index < size; ++index)
if(!(*compare) (work[smallestOrLargest], work[index])) smallestOrLargest = index;
swap(&work[smallestOrLargest], &work[i]);
} /* end if */
} /* end function selectionSort */
/*
=======================================================================================================================
swap values at memory locations to which ;
element1Ptr and element2Ptr point
=======================================================================================================================
*/
void swap(int *const element1Ptr, int *const element2Ptr)
{
int hold = *element1Ptr;
*element1Ptr = *element2Ptr;
*element2Ptr = hold;
} /* end function swap */
/*
=======================================================================================================================
determine whether element a is less than ;
element b for an a scending order sort
=======================================================================================================================
*/
bool ascending(int a, int b)
{
return a < b; /* returns true ifa is less than b */
} /* end function ascending */
/*
=======================================================================================================================
determine whether element a is greater than ;
element b for a descending order sort
=======================================================================================================================
*/
bool descending(int a, int b)
{
return a > b; /* returns true if a is greater than b */
} /* end function descending */
O(∩_∩)O