//  File: qsort3.C
//
//  Using the qsort() library function.
//  This time we use a silly hack to get qsort for integers and doubles.
//  Use the g++ compiler, not SGI CC

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>

//=====================================================================
// Use silly qsort hack 

#define DATA int
#include "qhack.C"
#undef DATA

#define DATA double
#include "qhack.C"
#undef DATA

//=====================================================================

main(int argc, char *argv[]) {
   int *A ;
   double *B ;
   int i, n = 0, r1, r2 ;
   long seed ;

   // read command line arguments
   if (argc != 3) {
      cerr << "Usage: qsort num seed\n" ;
      exit(1) ;
   }

   r1 = sscanf(argv[1], "%d", &n) ;
   r2 = sscanf(argv[2], "%ld", &seed) ; // %ld for long int

   if (r1 < 1 || r2 < 1 || n <= 0) {
      cerr << "Bad arguments!\n" ;
      exit(1) ;
   }

   // generate data

   srand48(seed) ;

   A = new int[n] ;
   if (A == NULL) {
      cerr << "Out of memory!\n" ;
      exit(1) ;
   }

   for (i = 0 ; i < n ; i++) {
      A[i] = (int) lrand48() ; // depends on data type
   }

   cout << "\n" << "Original Array:" << "\n" ;
   PrintArray(A, n) ;

   qsort(A, n) ;

   cout << "\nSorted Array:\n" ;
   PrintArray(A, n) ;

   if ( CheckArray(A, n) ) {
      cout << "\nArray is properly sorted\n" ;
   } else {
      cout << "\nArray is *NOT* sorted\n" ;
   }


   B = new double[n] ;
   if (B == NULL) {
      cerr << "Out of memory!\n" ;
      exit(1) ;
   }

   for (i = 0 ; i < n ; i++) {
      B[i] = (double) drand48() ; // depends on data type
   }

   cout << "\n" << "Original Array:" << "\n" ;
   PrintArray(B, n) ;

   qsort(B, n) ;

   cout << "\nSorted Array:\n" ;
   PrintArray(B, n) ;

   if ( CheckArray(B, n) ) {
      cout << "\nArray is properly sorted\n" ;
   } else {
      cout << "\nArray is *NOT* sorted\n" ;
   }

}
