/** predator.c ***************************************** * * CS661, Algorithms * University of Virginia Department of Computer Science * Copyright (C) 1999 * * Program which presents animation of five sorting * algorithms: insertion, shell, bubble, merge & quick. * by, * John Haskins, Jr. (predator@cs.virginia.edu) *******************************************************/ #include #include #include #define ESC 27 #define SPACE 32 #define NSCRBUF 64004 #define XSCRLEN 320 #define YSCRLEN 200 #define NSTAR 256 #define NFGSTAR 5 #define NBAR 75 #define SVGALO 0x13 #define TTY 0x02 #define __u16 unsigned int #define __u8 unsigned char #define INSSRT 0x01 #define SHLSRT 0x02 #define BBLSRT 0x03 #define MRGSRT 0x04 #define QUKSRT 0x05 #define bar_t int typedef struct { __u16 xcoord; __u16 ycoord; } star_t; int main(int,char **); void gb_graphsetvideo(__u8); void gb_scroll(char far *,__u16,__u16,__u16,__u16,__u8,__u8); void gb_putpixel(char far *,__u16,__u16,__u8); void gb_bar(char far *,__u16,__u16,__u16,__u16,__u8); void gb_waitretrace(void); void scrollstar(star_t *,__u8); void renderbar(char far *,bar_t *,__u8); void renderframe(char far *,__u8); char insertionsort(char far *,bar_t *,__u8); char shellsort(char far *,bar_t *,__u8); void swap(bar_t *,bar_t *); char bubblesort(char far *,bar_t *,__u8); char msort(bar_t *,bar_t *,__u8,__u8,__u8); char merge(bar_t *,bar_t *,__u8,__u8,__u8,__u8); char mergesort(char far *,bar_t *,__u8); char partition(bar_t *,__u8,__u8,int *,__u8); char qksort(bar_t *,__u8,__u8,__u8); char quicksort(char far *,bar_t *,__u8); char * bkgrnd; char * scrbuf; char * screen=(char *)0xa0000000; star_t bgstar[NSTAR]; star_t bgstar2[NSTAR]; star_t mgstar[NSTAR]; star_t fgstar[NSTAR]; bar_t bar[NBAR]; int main(int argc,char ** argv) { __u16 n; __u8 nbar=0; char c=0; __u8 srt=0; if (argc!=3) { fprintf(stderr,"usage: predator #bars "); fprintf(stderr,"[insertion|shell|bubble|merge|quick]\n"); exit(1); } nbar=atoi(argv[1]); if ((nbar < 1) || (nbar > NBAR)) { fprintf(stderr,"Nice try, Gabe!\n"); fprintf(stderr,"predator: # of bars must be [1..%d]\n",NBAR); exit(1); } if (!strcmp(argv[2],"insertion")) { srt=INSSRT; } else if (!strcmp(argv[2],"shell")) { srt=SHLSRT; } else if (!strcmp(argv[2],"bubble")) { srt=BBLSRT; } else if (!strcmp(argv[2],"merge")) { srt=MRGSRT; } else if (!strcmp(argv[2],"quick")) { srt=QUKSRT; } else { fprintf(stderr,"Nice try, Gabe!\n"); fprintf(stderr,"predator: algorithm must be,",NBAR); fprintf(stderr," insertion,shell,bubble,merge or quick\n",NBAR); exit(1); } if (!(bkgrnd=(char *)malloc(NSCRBUF))) { fprintf(stderr,"predator: "); fprintf(stderr,"Cannot allocate background buffer.\n"); exit(1); } if (!(scrbuf=(char *)malloc(NSCRBUF))) { fprintf(stderr,"predator: Cannot allocate screen buffer.\n"); exit(1); } gb_graphsetvideo(SVGALO); memset((void *)bkgrnd,0,NSCRBUF); #if 0 for(n=0;nxlen) return; for(line=y;line=YSCRLEN || x>=XSCRLEN) return; *(dest+(y*XSCRLEN)+x)=c; } void gb_bar(char far * dest,__u16 x,__u16 xlen,__u16 y,__u16 ylen,__u8 c) { char tmp[XSCRLEN]; __u16 xcoord; __u16 ycoord; __u16 length; if (y>=YSCRLEN || x>=XSCRLEN) return; memset((void *)tmp,c,XSCRLEN); if ((x+xlen-1)>XSCRLEN) length=XSCRLEN-x-1; else length=xlen; for(ycoord=y;ycoordXSCRLEN) { star[n].xcoord=XSCRLEN; star[n].ycoord=random(YSCRLEN); } } } void renderbar(char far * dest,bar_t * bar,__u8 nbar) { int n; __u8 xdisp=(XSCRLEN-(4*nbar))/2; for(n=0;nXSCRLEN) { fgstar[n].xcoord=XSCRLEN; fgstar[n].ycoord=random(YSCRLEN); } gb_putpixel((void *)dest, fgstar[n].xcoord,fgstar[n].ycoord, 15); gb_putpixel((void *)dest, fgstar[n].xcoord+1,fgstar[n].ycoord, 15); gb_putpixel((void *)dest, fgstar[n].xcoord+2,fgstar[n].ycoord, 9); gb_putpixel((void *)dest, fgstar[n].xcoord+3,fgstar[n].ycoord, 1); gb_putpixel((void *)dest, fgstar[n].xcoord+4,fgstar[n].ycoord, 18); } gb_waitretrace(); memcpy((void *)screen,(void *)dest,NSCRBUF); } char insertionsort(char far * dest,bar_t * bar,__u8 nbar) { int j,n; bar_t tmp; for(n=1;n0 && tmp0) { for(i=incr;i=0) { if (tmp0;n--) { for(m=0;m0 && !(bar[j]<=x)); if (j<0) j=0; do { i++; renderframe(scrbuf,nbar); if (kbhit() && (getch()==ESC)) return ESC; } while (i=x)); if (i>=nbar) i=nbar-1; if (i