CS1050: Understanding and Constructing Proofs Spring 2006 Programming Project 2 SORTING Lecture 05, file P2 Due January 31 before class as a link on your PPP Jarek Rossignac Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 1 Start with the sample P2 • Access the applet at http://www.gvu.gatech.edu/~jarek/courses/1050/processing/P2/ • Click in the window and hold mouse down to see animation • It sorts random numbers and then animates the sorting Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 2 Declarations • • • • • • • • • • • • • • PFont fontUsed; // name of font used for writing on the graphic screen int H=5; // number of entries in the table int T[] = new int[H]; // table (array). Will contain integers int AT[] = new int[H]; // copy of the table for animation int swaps[][] = new int[H*H+1][2]; // record swaps (pair of indices) color myRed = color(250,100,100); color myGreen = color(100,250,100); color myBlue = color(100,100,250); // my colors (R,G,B) in [0,255] int cw, ch; // cell width and height int c=0, mc=150; // animation counter and max int w=0, mw=50; // wait counter and max int swap=0; // index to swaps int swapMax=0; // counter of th enumber of swaps float t=0.0; // animation parameter int s1, s2; // indics of the current pair to be swapped Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 3 Setup void setup() { // executed only once as initialization size(500, 500); // opens graphic window of 600x600 pixels. \ cw=int(35); // computes cell sizes leaving a margin, Cast to integer ch=int(0.9*height/H); // (height and width of window are keywords) fontUsed = loadFont("Times-Roman-25.vlw"); // this font must be loaded (MENU-BAR > TOOLS > CREATE FONTS) textFont(fontUsed, 20); // selects font and assigns size for (int i=0; i<H; i++) {T[i]=int(random(2*H)); }; // init with random numbers for (int i=0; i<H; i++) {AT[i]=T[i]; }; // copy to animation table println(); println(" *** unsorted list ***"); for (int i=0; i<H; i++) { println("T["+i+"]="+T[i]);}; bubbleSort(); // call to my naive sorting routine }; // end of setup Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 4 bubbleSort void bubbleSort() { // my simple sorting, replace by yours for (int j=H-1; j>0; j--) { for (int i=0; i<j; i++) { if (T[i]>T[i+1]) {doSwap(i,i+1);}; }; }; }; void doSwap(int s1, int s2) { int temp=T[s1]; T[s1]=T[s2]; T[s2]=temp; the swap swaps[swapMax][0]=s1; // records the swap swaps[swapMax][1]=s2; swapMax++; }; Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab // performs Georgia Tech, IIC, GVU, 2006 5 Draw // will be executed continuously to refresh the window many frames per second void draw() { background(200); // erases screen and set up a light grey background strokeWeight(2); // lines will be drawn thicker translate(width*0.05,height*0.05); // move the origin to leave a margin if (mousePressed) // moves animation by one step when mouse pressed {advanceAnimation(); }; ShowTable(); // Displays the partially sorted table with animation state if (done) {noLoop();}; // stops when done }; // end of draw Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 6 advanceAnimation void advanceAnimation () { s1=swaps[swap][0]; s2=swaps[swap][1]; // entries to be swapped are retrieved from list of swaps if (w<mw) {w++;} // advance the wait counter if(w==mw) { // when done waiting t=float(c)/float(mc); // compute animation time in [0,1] c++; // advance animation counter if (c==mc) { // when animation done for this swap w=0; c=0; t=0; // reset time and counters int temp=AT[s1]; AT[s1]=AT[s2]; AT[s2]=temp; // do the actual swap swap++; // next swap if (swap==swapMax) {done=true; swap=swapMax;} // all swaps done }; }; }; Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 7 ShowTable void ShowTable() { // displays able animated int ax, ay; // displacements for the cels being swapped color cellColor = myGreen; // default color for cells float r=(s2-s1)*ch; // radius for circular animation int sa=int(r*sin(t*TWO_PI/2.0)/2.0); // horizontal displacement for (int h=0; h<H; h++) { // go through the cells cellColor=myGreen; // default color for non-swapping cells is green ax=0; ay=0; // no displacement for non-swapping cells if (h==s1) {ay=int(t*r); ax=sa; cellColor=myRed; }; // if upper swap cell if (h==s2) {ay=-int(t*r); ax=-sa; cellColor=myBlue; }; // if lower swap cell drawCell(width/2-cw+ax,h*ch+ay,cw,ch,cellColor,AT[h]); }; }; void drawCell(int wp, int hp, int cwp, int chp, color cp, int vp) { fill(cp); rect(wp,hp,cwp,chp); // draws and fills a rectangular region fill(0); text(nf(vp,2),wp+cwp/10,hp+chp*0.8); }; // writes vp on the screen Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 8 Implement 3 variants of bubblesort • Bubble sort is described page 125 • Add three alternatives to bubbleSort – A modified bubble sort algorithm that stops when no interchange is required (exercise 37 page 130) – Modified insertion sort • If the next nth element is smaller than the one it follows, • then bubble it up • until it is in the correct place in the sorted list of the first n elements – A modified selection sort (presented at the bottom of page 130) • • • • • Jarek Rossignac Start with n=1 Assume that the first n–1 elements are sorted. Find the smallest of the remaining elements Swap it with the nth element Increment n http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 9 Enhance the user interface Increase the size of the array. Let the user press a key for the following actions: “r”: to select a new random set of numbers “n”: to select a nearly sorted set of numbers “b”: to run my naïve bubblesort “e”: to run your modified bubblesort that stops early “i”: to run your modified insertion sort “s”: to run your modified selection sort When the mouse is in the window and pressed, run the animation of the algorithm that was run last (make sure that you write in the graphics window the total number of swaps). Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 10 Report results • Debug your program and make images for each combination • Execute all 4 algorithms on several sets of random numbers and on several sets of nearly sorted numbers • Watch the 4 algorithms and provide a qualitative characterization of the differences in their behavior for random and nearly sorted numbers • Report statistics of the average number of swaps for each algorithm (separating random and nearly sorted sets). • Post on your PPP: – images (before and after) with number of swaps for each algorithm on a random and on a nearly sorted set. – your qualitative characterization – statistics with conclusions – links to applet and source code Jarek Rossignac http://www.gvu.gatech.edu/~jarek MAGIC Lab Georgia Tech, IIC, GVU, 2006 11