#include <stdio.h>
#include <stdlib.h>
#include <exec/types.h>
#include <intuition/intuition.h>

#define ARRAYMAX 480
struct RastPort *rp; /* global so qsort()can see it.. */

void main(int argc, char **argv)
{
  int array[ARRAYMAX];
  float sec,getelapsed();
  int loop;
  int abort=0, test=0;
  void insertion_sort(), bubble_sort(), heap_sort();
  extern struct IntuitionBase *IntuitionBase;
  extern struct GfxBase *GfxBase;
  unsigned int time1[2], time2[2];
  void quicksort(), clearscreen(), putpos(),*sortfun;
  void init();
  void display();
  void permute(), OpenAll();
  struct Window *makewindow(), *mywindow;
  struct Screen *myscreen, *makescreen();
  if (argc>1) abort=atoi(argv[1]);
  if (argc>2) test=atoi(argv[2]);
  switch (test) {
   case 0 : sortfun=insertion_sort;
            break;
   case 1 : sortfun=bubble_sort;
            break;
   case 2 : sortfun=heap_sort;
	    break;
   default : sortfun=insertion_sort;
             break;
            }
  OpenAll();
  myscreen=makescreen();
  mywindow=makewindow(myscreen);  
  rp=mywindow->RPort;
  init(array);
  permute(array);
  timer(time1);
  SetAPen(rp,1);
  for (loop=0;loop<ARRAYMAX;loop++)
  {
	WritePixel(rp,loop,array[loop]);
  }
  quicksort(array,0,(ARRAYMAX-1),abort,sortfun);
  timer(time2);
  sec=getelapsed(time1,time2);
  printf("Time elapsed: %2.4f\n", sec);
  Delay(250L);
  CloseWindow(mywindow);
  CloseScreen(myscreen);
  CloseLibrary(GfxBase);
  CloseLibrary(IntuitionBase);
}

void init(int *array)
{
  int loop;
  for (loop=0;loop<ARRAYMAX;loop++) array[loop]=loop;
}

void display(int *array)
{
  int loop;
  for (loop=0;loop<ARRAYMAX;loop++) printf("[%03d]", array[loop]);
  printf("\n");
}

void permute(int *array)
{
  int index;
  int tmp;
  int swap;
  for (index=0;index<ARRAYMAX;index++)
  {
    swap=rand()%ARRAYMAX;
    tmp=array[index];
    array[index]=array[swap];
    array[swap]=tmp;
  }
}

void clearscreen()
{
  printf("\033[H\033[J");
}

void putpos(int x, int y)
{
  printf("\033[%d;%dHX",y,x);
}

void clearpos(int x, int y)
{
  printf("\033[%d;%dH ",y,x);
}

float getelapsed(unsigned int start[2], unsigned int elapsed[2])
{ 
  float t1;
  unsigned int begin;
  float micros;
  begin=elapsed[0]-start[0];
  micros=((float)elapsed[1]/1000000.0)-((float)start[1]/1000000.0);
  t1 = (float)begin+micros;
#ifdef DEBUGGING
  printf("sec: %d Micros: %f Sum: %f\n", begin, micros, t1);
#endif
  return((float)(t1));
}
