//  File: qsort1.C
//
//  Using the qsort() library function
//  Use the g++ compiler, not SGI CC

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

//=====================================================================
// Type of data we are sorting

typedef int data ;


//=====================================================================
// Function prototypes

static int compare(const data *, const data *) ;
static void PrintArray(data[] , int) ;
static int CheckArray(data[], int) ;


// Local Functions

static int compare(const data *ptr1, const data *ptr2) {

   if (*ptr1 < *ptr2) return -1 ;
   if (*ptr1 > *ptr2) return  1 ;
   return 0 ;
}


static void PrintArray(data A[], int n) {
   int i ;

   for (i = 0 ; i < n ; i++) {
      cout.width(14) ;      // Output at least 14 chars wide
      cout << A[i] << " " ; // does not depend on data
      if (i % 5 == 4) cout << "\n" ;
   }
   if (n % 5 != 0) cout << "\n" ;   // Print one more CR ?
}


static int CheckArray(data A[], int n) {
   int i ;

   for (i = 0 ; i < n-1 ; i++) {
      if (A[i] > A[i+1]) return 0 ;
   }
   return 1 ;
}


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

main(int argc, char *argv[]) {
   data *A ;
   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 data[n] ;
   if (A == NULL) {
      cerr << "Out of memory!\n" ;
      exit(1) ;
   }

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

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

   qsort(A, n, sizeof(data), compare) ;

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

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

}
