Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --coursework.h--
- #ifndef COURSEWORK_H
- #define COURSEWORK_H
- #include <gtk/gtk.h>
- #define TREEOFFSETX 10
- #define TREEOFFSETY 70
- #define LINEOFFSETX 20
- #define LINEOFFSETY 300
- #define RISE 30
- #define VCOUNT 10
- #define HCOUNT 20
- #define CENTERTEXTOFFSETY 20
- #define CENTERTEXTHEADER "Текущее действие:"
- #define SHADOWOFFSET -1
- #define LEGENDOFFSETX 5
- #define LEGENDY 60
- #define LEGENDINNEROFFSETX 10
- #define LEGENDINNEROFFSETY 10
- #define LEGENDWIDTH 290
- #define LEGENDHEADERHEIGHT 20
- #define LEGENDHEADER "Легенда"
- #define RAD 14
- #define GAP 0
- #define N 26
- #define MOD 100
- #define STATECNT 9
- #define MOVEDELAY 10
- #define REDRAWDELAY 300
- #define SORTDELAY 400
- #define WIDTH 800
- #define HEIGHT 360
- typedef struct elpath elpath;
- typedef struct element element;
- typedef struct action action;
- typedef enum elstate elstate;
- typedef enum actiontype actiontype;
- typedef union actionparameter actionparameter;
- enum elstate
- {
- normal=0,
- inplace=1,
- inheap=2,
- processed=3,
- active=4,
- activeinplace=5,
- activeinheap=6,
- activeproc=7,
- activeinterval=8
- };
- enum actiontype
- {
- acsleep,
- acswap,
- acchangestate,
- acchangephase
- };
- union actionparameter
- {
- struct
- {
- int id1,id2;
- } swap;
- int time;
- struct
- {
- int id;
- elstate state;
- } chgst;
- int phase;
- };
- struct elpath
- {
- GList *linecurve,*treecurve;
- int elnum;
- };
- struct element
- {
- GdkPoint linecoord,treecoord;
- int value;
- elstate state;
- };
- struct action
- {
- actiontype type;
- actionparameter param;
- };
- void init_gc();
- void init_sort();
- void init_legend();
- void draw_element(GtkWidget *w,GdkDrawable *d, element *e);
- void draw_text_in_center(gchar * text, GtkWidget *w, GdkDrawable *d, GdkGC *gc, gint xc, gint yc);
- void draw_text_in_center_y(gchar * text, GtkWidget *w, GdkDrawable *d, GdkGC *gc, gint x, gint yc);
- void draw_legend();
- void startmoving(elpath *p1,elpath *p2);
- void swap(int idx1,int idx2);
- void swapvis(int idx1,int idx2);
- void displayphasetxt();
- void genline(GdkPoint s, GdkPoint t,int cnt,GList ** l);
- void insertswap(int idx1,int idx2);
- void insertchangestate(int idx,elstate newstate);
- void insertsleep(int t);
- void insertchangephase(int np);
- void heapsort(int *array);
- void quicksort(int n,int *a,int offset);
- GdkPoint getlinecoord(int n);
- GdkPoint gettreecoord(int n,int maxh);
- elpath makepath(gint idx,GdkPoint listb,GdkPoint liste, gint dy, gint listc1, gint listc2,gint listc3,GdkPoint treep1,GdkPoint treep2, gint treec);
- gboolean move(elpath* p);
- gboolean expose_event(GtkWidget *w,GdkEvent *e, gpointer data);
- gboolean delete_event(GtkWidget *w,GdkEvent *e, gpointer data);
- gboolean visualize(gpointer data);
- #endif
- --coursework.c--
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <gtk/gtk.h>
- #include "coursework.h"
- GtkWidget *window;
- GdkPixmap *legend;
- GdkGC *gcbg[STATECNT],*gcfg[STATECNT];
- GSList *actionqueue=NULL;
- element el[N];
- int arrv[N];
- char phasetxt[4][100]={"Построение кучи","Исключение наибольшего элемента","Восстановление кучи","Сортировка окончена"};
- #if HEAPSORTA
- gboolean legendshow[STATECNT]={TRUE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE};
- #elif HEAPSORTB
- gboolean legendshow[STATECNT]={TRUE,TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE};
- #elif SHELLSORT
- gboolean legendshow[STATECNT]={TRUE,FALSE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE};
- #elif BUBBLESORT
- gboolean legendshow[STATECNT]={TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE};
- #elif QUICKSORT
- gboolean legendshow[STATECNT]={TRUE,FALSE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE,TRUE};
- #endif
- int legendshowcnt;
- int legendheight;
- char legendtext[STATECNT][100]={"Обычный","На своём месте","В куче","Обрабатывается","Перемещается","Перемещается на своё место","","","Текущий интервал"};
- int phase;
- int finished;
- int clrneed;
- int hi,hj;
- int legx,legy;
- int main(int argc,char * argv[])
- {
- int i;
- int maxh;
- gtk_init(&argc,&argv);
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_widget_set_size_request(window,WIDTH,HEIGHT);
- srand(time(0));
- for(maxh=0;(1<<maxh)<=N;maxh++);
- for(i=0;i<N;i++)
- {
- el[i].linecoord=getlinecoord(i);
- el[i].treecoord=gettreecoord(i,maxh);
- arrv[i]=el[i].value=rand()%MOD;
- el[i].state=normal;
- }
- gtk_widget_show(window);
- init_gc();
- init_sort();
- init_legend();
- g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(delete_event),NULL);
- g_signal_connect(G_OBJECT(window),"expose-event",G_CALLBACK(expose_event),NULL);
- expose_event(window,NULL,NULL);
- gtk_main();
- return 0;
- }
- void init_gc()
- {
- GdkColor c;
- gcbg[normal]=gdk_gc_new(window->window);
- gcfg[normal]=gdk_gc_new(window->window);
- gcbg[active]=gdk_gc_new(window->window);
- gcfg[active]=gdk_gc_new(window->window);
- gcbg[inplace]=gdk_gc_new(window->window);
- gcfg[inplace]=gdk_gc_new(window->window);
- gcbg[activeinheap]=gcbg[active];
- gcfg[activeinheap]=gcfg[active];
- gcbg[inheap]=gdk_gc_new(window->window);
- gcfg[inheap]=gdk_gc_new(window->window);
- gcbg[activeinplace]=gdk_gc_new(window->window);
- gcfg[activeinplace]=gdk_gc_new(window->window);
- gcbg[inheap]=gdk_gc_new(window->window);
- gcfg[inheap]=gdk_gc_new(window->window);
- gcbg[activeinplace]=gdk_gc_new(window->window);
- gcfg[activeinplace]=gdk_gc_new(window->window);
- gcbg[processed]=gdk_gc_new(window->window);
- gcfg[processed]=gdk_gc_new(window->window);
- gcbg[activeproc]=gcbg[active];
- gcfg[activeproc]=gcfg[active];
- gcbg[activeinterval]=gcbg[inplace];
- gcfg[activeinterval]=gcfg[inplace];
- c.red=255*257;
- c.green=250*257;
- c.blue=173*257;
- gdk_gc_set_rgb_fg_color(gcbg[normal],&c);
- c.red=97*257;
- c.green=78*257;
- c.blue=0*257;
- gdk_gc_set_rgb_fg_color(gcfg[normal],&c);
- c.red=255*257;
- c.green=255*257;
- c.blue=255*257;
- gdk_gc_set_rgb_fg_color(gcbg[active],&c);
- c.red=118*257;
- c.green=0*257;
- c.blue=0*257;
- gdk_gc_set_rgb_fg_color(gcfg[active],&c);
- c.red=205*257;
- c.green=188*257;
- c.blue=0*257;
- gdk_gc_set_rgb_fg_color(gcbg[inplace],&c);
- c.red=0*257;
- c.green=0*257;
- c.blue=0*257;
- gdk_gc_set_rgb_fg_color(gcfg[inplace],&c);
- c.red=246*255;
- c.green=197*255;
- c.blue=0*255;
- gdk_gc_set_rgb_fg_color(gcbg[inheap],&c);
- c.red=97*257;
- c.green=78*257;
- c.blue=0*257;
- gdk_gc_set_rgb_fg_color(gcfg[inheap],&c);
- c.red=255*257;
- c.green=255*257;
- c.blue=255*257;
- gdk_gc_set_rgb_fg_color(gcbg[activeinplace],&c);
- c.red=97*257;
- c.green=78*257;
- c.blue=0*257;
- gdk_gc_set_rgb_fg_color(gcfg[activeinplace],&c);
- c.red=169*257;
- c.green=255*257;
- c.blue=142*257;
- gdk_gc_set_rgb_fg_color(gcbg[processed],&c);
- c.red=0*257;
- c.green=0*257;
- c.blue=0*257;
- gdk_gc_set_rgb_fg_color(gcfg[processed],&c);
- }
- void init_sort()
- {
- phase=0;
- hi=1;
- hj=1;
- finished=2;
- clrneed=1;
- heapsort(arrv);
- g_timeout_add(SORTDELAY,(GSourceFunc) visualize,actionqueue);
- }
- void init_legend()
- {
- int i;
- element e;
- legx=-1;
- legy=-1;
- legendshowcnt=0;
- for(i=0;i<STATECNT;i++)
- if(legendshow[i]) legendshowcnt++;
- legendheight=LEGENDINNEROFFSETY+2*RAD*legendshowcnt+GAP*(legendshowcnt-1)+LEGENDINNEROFFSETY+LEGENDHEADERHEIGHT;
- legend=gdk_pixmap_new(window->window,LEGENDWIDTH+2,legendheight+2,-1);
- gdk_draw_rectangle(legend,window->style->bg_gc[GTK_WIDGET_STATE(window)],TRUE,0,0,LEGENDWIDTH+2,legendheight+2);
- draw_text_in_center(LEGENDHEADER,window,legend,window->style->black_gc,LEGENDWIDTH/2,LEGENDHEADERHEIGHT/2);
- gdk_draw_rectangle(legend,window->style->white_gc,FALSE,1,LEGENDHEADERHEIGHT,LEGENDWIDTH-1,legendheight-LEGENDHEADERHEIGHT-1);
- gdk_draw_rectangle(legend,window->style->black_gc,FALSE,2,LEGENDHEADERHEIGHT+1,LEGENDWIDTH-1,legendheight-LEGENDHEADERHEIGHT-1);
- e.linecoord.x=LEGENDINNEROFFSETX;
- e.linecoord.y=LEGENDINNEROFFSETY+LEGENDHEADERHEIGHT;
- e.treecoord.x=LEGENDINNEROFFSETX+2*RAD+5;
- e.treecoord.y=LEGENDINNEROFFSETY+LEGENDHEADERHEIGHT;
- e.value=00;
- for(i=0;i<STATECNT;i++)
- {
- if(!legendshow[i]) continue;
- e.state=i;
- draw_element(window,legend,&e);
- draw_text_in_center_y(legendtext[i],window,legend,window->style->black_gc,e.linecoord.x+4*RAD+2*GAP+LEGENDINNEROFFSETX,e.linecoord.y+RAD);
- e.linecoord.y+=2*RAD+GAP;
- e.treecoord.y+=2*RAD+GAP;
- }
- }
- gboolean visualize(gpointer data)
- {
- action cur;
- while(actionqueue)
- {
- cur=*((action*) actionqueue->data);
- free(actionqueue->data);
- actionqueue=g_slist_remove(actionqueue,actionqueue->data);
- switch(cur.type)
- {
- case acsleep:
- g_timeout_add(cur.param.time,(GSourceFunc) visualize,actionqueue);
- return FALSE;
- case acswap:
- swapvis(cur.param.swap.id1,cur.param.swap.id2);
- return FALSE;
- case acchangestate:
- el[cur.param.chgst.id].state=cur.param.chgst.state;
- draw_element(window,window->window,&(el[cur.param.chgst.id]));
- break;
- case acchangephase:
- phase=cur.param.phase;
- displayphasetxt();
- break;
- }
- }
- return FALSE;
- }
- gboolean expose_event(GtkWidget *w, GdkEvent *e, gpointer data)
- {
- int i;
- displayphasetxt();
- draw_legend();
- for(i=0;i<N;i++)
- {
- draw_element(w,w->window,&el[i]);
- }
- return TRUE;
- }
- GdkPoint gettreecoord(int n,int maxh)
- {
- GdkPoint res;
- int h;
- for(h=0;(1<<h)<=n+1;h++);
- res.x=TREEOFFSETX+((1<<(maxh-h))-1)*(2*RAD+GAP)/2.0+( (1<<(maxh-h))*GAP+((1<<(maxh-h)))*2*RAD)*(n-(1<<(h-1))+1);
- res.y=TREEOFFSETY+(h-1)*(2*RAD+GAP);
- return res;
- }
- GdkPoint getlinecoord(int n)
- {
- GdkPoint res;
- res.x=LINEOFFSETX+(2*RAD+GAP)*n;
- res.y=LINEOFFSETY;
- return res;
- }
- void draw_element(GtkWidget *w,GdkDrawable *d, element *e)
- {
- char s[10];
- sprintf(s,"%.2d",e->value);
- // gdk_draw_arc(d,gcbg[e->state],TRUE,e->linecoord.x,e->linecoord.y,2*RAD,2*RAD,0,64*360);
- // gdk_draw_arc(d,gcfg[e->state],FALSE,e->linecoord.x,e->linecoord.y,2*RAD,2*RAD,0,64*360);
- gdk_draw_rectangle(d,gcbg[e->state],TRUE,e->linecoord.x,e->linecoord.y,2*RAD,2*RAD);
- gdk_draw_rectangle(d,gcfg[e->state],FALSE,e->linecoord.x,e->linecoord.y,2*RAD,2*RAD);
- draw_text_in_center(s,w,d,gcfg[e->state],e->linecoord.x+RAD,e->linecoord.y+RAD);
- // gdk_draw_rectangle(d,gcbg[e->state],TRUE,e->treecoord.x,e->treecoord.y,2*RAD,2*RAD);
- // gdk_draw_rectangle(d,gcfg[e->state],FALSE,e->treecoord.x,e->treecoord.y,2*RAD,2*RAD);
- #if HEAPSORTA || HEAPSORTB
- gdk_draw_arc(d,gcbg[e->state],TRUE,e->treecoord.x,e->treecoord.y,2*RAD,2*RAD,0,64*360);
- gdk_draw_arc(d,gcfg[e->state],FALSE,e->treecoord.x,e->treecoord.y,2*RAD,2*RAD,0,64*360);
- draw_text_in_center(s,w,d,gcfg[e->state],e->treecoord.x+RAD,e->treecoord.y+RAD);
- #endif
- }
- void draw_text_in_center(gchar * text, GtkWidget *w, GdkDrawable *d, GdkGC *gc, gint xc, gint yc)
- {
- PangoContext *context=gtk_widget_create_pango_context(w);
- PangoLayout *layout= pango_layout_new(context);
- gint width,height;
- pango_layout_set_text(layout,text,-1);
- pango_layout_get_pixel_size(layout,&width,&height);
- gdk_draw_layout (d,gc,xc-width/2,yc-height/2,layout);
- g_object_unref(context); g_object_unref(layout);
- }
- void draw_text_in_center_y(gchar * text, GtkWidget *w, GdkDrawable *d, GdkGC *gc, gint x, gint yc)
- {
- PangoContext *context=gtk_widget_create_pango_context(w);
- PangoLayout *layout= pango_layout_new(context);
- gint width,height;
- pango_layout_set_text(layout,text,-1);
- pango_layout_get_pixel_size(layout,&width,&height);
- gdk_draw_layout (d,gc,x,yc-height/2,layout);
- g_object_unref(context); g_object_unref(layout);
- }
- void draw_legend()
- {
- if(legx>0&&legy>0)
- gdk_window_clear_area(window->window,legx,legy,legx+LEGENDWIDTH,legy+legendheight);
- legx=window->allocation.width-LEGENDOFFSETX-LEGENDWIDTH;
- legy=LEGENDY;
- gdk_draw_drawable(window->window,window->style->fg_gc[GTK_WIDGET_STATE(window)],legend,0,0,legx,legy,-1,-1);
- }
- void displayphasetxt()
- {
- gdk_window_clear_area(window->window,0,0,window->allocation.width,2*CENTERTEXTOFFSETY+2);
- draw_text_in_center(phasetxt[phase],window,window->window,window->style->white_gc,window->allocation.width/2+SHADOWOFFSET,CENTERTEXTOFFSETY+SHADOWOFFSET);
- draw_text_in_center(phasetxt[phase],window,window->window,window->style->black_gc,window->allocation.width/2,CENTERTEXTOFFSETY);
- draw_text_in_center_y(CENTERTEXTHEADER,window,window->window,window->style->black_gc,10,CENTERTEXTOFFSETY);
- }
- void startmoving(elpath *p1,elpath *p2)
- {
- finished=0;
- g_timeout_add(MOVEDELAY,(GSourceFunc) move,(gpointer) p1);
- g_timeout_add(MOVEDELAY,(GSourceFunc) move,(gpointer) p2);
- }
- void insertswap(int idx1,int idx2)
- {
- action *n=(action*) malloc(sizeof(action));
- n->type=acswap;
- n->param.swap.id1=idx1;
- n->param.swap.id2=idx2;
- actionqueue=g_slist_append(actionqueue,n);
- }
- void insertchangestate(int idx,elstate newstate)
- {
- action *n=(action*) malloc(sizeof(action));
- n->type=acchangestate;
- n->param.chgst.id=idx;
- n->param.chgst.state=newstate;
- actionqueue=g_slist_append(actionqueue,n);
- }
- void insertsleep(int t)
- {
- action *n=(action*) malloc(sizeof(action));
- n->type=acsleep;
- n->param.time=t;
- actionqueue=g_slist_append(actionqueue,n);
- }
- void insertchangephase(int np)
- {
- action *n=(action*) malloc(sizeof(action));
- n->type=acchangephase;
- n->param.phase=np;
- actionqueue=g_slist_append(actionqueue,n);
- }
- gboolean move(elpath* p)
- {
- int i;
- GdkPoint lc,tc;
- lc=el[p->elnum].linecoord;
- tc=el[p->elnum].treecoord;
- gdk_window_clear_area(window->window,el[p->elnum].linecoord.x,el[p->elnum].linecoord.y,2*RAD+1,2*RAD+1);
- gdk_window_clear_area(window->window,el[p->elnum].treecoord.x,el[p->elnum].treecoord.y,2*RAD+1,2*RAD+1);
- if(p->linecurve!=NULL)
- {
- el[p->elnum].linecoord=*((GdkPoint*) p->linecurve->data);
- free(p->linecurve->data);
- p->linecurve=g_list_remove(p->linecurve,p->linecurve->data);
- }
- if(p->treecurve!=NULL)
- {
- el[p->elnum].treecoord=*((GdkPoint*) p->treecurve->data);
- free(p->treecurve->data);
- p->treecurve=g_list_remove(p->treecurve,p->treecurve->data);
- }
- for(i=0;i<N;i++)
- {
- if(i==p->elnum) continue;
- if((el[i].linecoord.x+2*RAD+1>=lc.x&&el[i].linecoord.x<=lc.x+2*RAD+1&&el[i].linecoord.y+2*RAD+1>=lc.y&&el[i].linecoord.y<=lc.y+2*RAD+1)||
- (el[i].treecoord.x+2*RAD+1>=tc.x&&el[i].treecoord.x<=tc.x+2*RAD+1&&el[i].treecoord.y+2*RAD+1>=tc.y&&el[i].treecoord.y<=tc.y+2*RAD+1))
- {
- draw_element(window,window->window,&el[i]);
- }
- }
- if(p->linecurve==NULL&&p->treecurve==NULL)
- {
- switch(el[p->elnum].state)
- {
- case activeinplace:
- el[p->elnum].state=inplace;
- break;
- case activeinheap:
- el[p->elnum].state=inheap;
- break;
- case activeproc:
- el[p->elnum].state=processed;
- break;
- default:
- el[p->elnum].state=normal;
- }
- }
- draw_element(window,window->window,&el[p->elnum]);
- if(p->linecurve==NULL&&p->treecurve==NULL)
- {
- finished++;
- free(p);
- if(finished==2&&phase==1)
- phase=2;
- if(finished==2)
- g_timeout_add(SORTDELAY,(GSourceFunc) visualize,NULL);
- return FALSE;
- }
- return TRUE;
- }
- void swap(int idx1,int idx2)
- {
- int t=arrv[idx1];
- arrv[idx1]=arrv[idx2];
- arrv[idx2]=t;
- insertswap(idx1,idx2);
- }
- void swapvis(int idx1,int idx2)
- {
- elpath *p1,*p2;
- int i;
- element t;
- t=el[idx1];
- el[idx1]=el[idx2];
- el[idx2]=t;
- p1=(elpath*) malloc(sizeof(elpath));
- p2=(elpath*) malloc(sizeof(elpath));
- *p1=makepath(idx1,el[idx1].linecoord,el[idx2].linecoord,-RISE,VCOUNT,HCOUNT,VCOUNT,el[idx1].treecoord,el[idx2].treecoord,2*VCOUNT+HCOUNT-2);
- *p2=makepath(idx2,el[idx2].linecoord,el[idx1].linecoord,+RISE,VCOUNT,HCOUNT,VCOUNT,el[idx2].treecoord,el[idx1].treecoord,2*VCOUNT+HCOUNT-2);
- switch(el[idx1].state)
- {
- case inplace:
- el[idx1].state=activeinplace;
- break;
- case inheap:
- el[idx1].state=activeinheap;
- break;
- case processed:
- el[idx1].state=activeproc;
- break;
- default:
- el[idx1].state=active;
- }
- switch(el[idx2].state)
- {
- case inplace:
- el[idx2].state=activeinplace;
- break;
- case inheap:
- el[idx2].state=activeinheap;
- break;
- case processed:
- el[idx2].state=activeproc;
- break;
- default:
- el[idx2].state=active;
- }
- startmoving(p1,p2);
- }
- void genline(GdkPoint s, GdkPoint t,int cnt,GList ** l)
- {
- GdkPoint m,*c;
- int i;
- m=s;
- for(i=1;i<cnt;i++)
- {
- c=(GdkPoint*) malloc(sizeof(GdkPoint));
- *c=m;
- *l=g_list_append(*l,c);
- m.x=s.x+i*1.0*(t.x-s.x)/(cnt-1);
- m.y=s.y+i*1.0*(t.y-s.y)/(cnt-1);
- }
- }
- elpath makepath(gint idx,GdkPoint listb,GdkPoint liste, gint dy, gint listc1, gint listc2,gint listc3,GdkPoint treep1,GdkPoint treep2, gint treec)
- {
- GdkPoint s,t,*c;
- elpath res;
- double tx,ty;
- GList *listl=NULL,*treel=NULL;
- int i;
- s=t=listb;
- t.y+=dy;
- genline(s,t,listc1,&listl);
- s=listb;
- s.y+=dy;
- t=liste;
- t.y+=dy;
- genline(s,t,listc2,&listl);
- s=liste;
- s.y+=dy;
- t=liste;
- genline(s,t,listc3,&listl);
- c=(GdkPoint*) malloc(sizeof(GdkPoint));
- *c=t;
- listl=g_list_append(listl,c);
- genline(treep1,treep2,treec,&treel);
- c=(GdkPoint*) malloc(sizeof(GdkPoint));
- *c=treep2;
- treel=g_list_append(treel,c);
- res.linecurve=listl;
- res.treecurve=treel;
- res.elnum=idx;
- return res;
- }
- void upHeap(int* array, int i)
- {
- if(i>0)
- {
- if(array[i]>array[(i-1)/2])
- {
- swap(i,(i-1)/2);
- upHeap(array,(i-1)/2);
- }
- }
- }
- void downHeap(int* array, int i,int cnt)
- {
- int child=i*2+1;
- if(child<cnt)
- {
- if(child+1<cnt&&array[child]<array[child+1])
- child++;
- if(array[child]>array[i])
- {
- swap(child,i);
- downHeap(array,child,cnt);
- }
- }
- }
- void heapsort(int *array)
- {
- int i;
- #ifdef HEAPSORTA
- insertchangestate(0,inheap);
- insertsleep(SORTDELAY);
- for(i=1;i<N;i++)
- {
- insertchangestate(i,inheap);
- insertsleep(REDRAWDELAY);
- upHeap(array,i);
- insertsleep(SORTDELAY);
- }
- for(i=0;i<N;i++)
- {
- insertchangestate(i,normal);
- }
- insertsleep(SORTDELAY);
- for(i=N-1;i>0;i--)
- {
- insertchangephase(1);
- insertchangestate(0,inplace);
- swap(i,0);
- insertchangephase(2);
- insertsleep(REDRAWDELAY);
- downHeap(array,0,i);
- insertsleep(SORTDELAY);
- }
- insertchangestate(0,inplace);
- insertchangephase(3);
- #elif HEAPSORTB
- for(i=N-1;2*i+1>=N;i--)
- {
- insertchangestate(i,processed);
- }
- for(i=N/2-1;i>=0;i--)
- {
- insertchangestate(i,processed);
- downHeap(array,i,N);
- insertsleep(SORTDELAY);
- }
- for(i=0;i<N;i++)
- {
- insertchangestate(i,normal);
- }
- insertsleep(SORTDELAY);
- for(i=N-1;i>0;i--)
- {
- insertchangephase(1);
- insertchangestate(0,inplace);
- swap(i,0);
- insertchangephase(2);
- insertsleep(REDRAWDELAY);
- downHeap(array,0,i);
- insertsleep(SORTDELAY);
- }
- insertchangestate(0,inplace);
- insertchangephase(3);
- #elif SHELLSORT
- int h = 1;
- int prev;
- while ( h <= N / 9 )
- h = 3 * h + 1;
- while ( h > 0 ) {
- for ( i = h; i < N; i++ ) {
- int k;
- for(k=i;k>=0;k-=h)
- insertchangestate(k,processed);
- insertsleep(REDRAWDELAY);
- int j, save = array[i];
- prev=i;
- for ( j = i; j >= h && array[j - h] > save; j -= h )
- {
- swap(j,j-h);
- }
- for(k=i;k>=0;k-=h)
- insertchangestate(k,normal);
- insertsleep(REDRAWDELAY);
- }
- h /= 3;
- }
- #elif BUBBLESORT
- for(i=0;i<N;i++)
- {
- int j;
- for(j=0;j<N-i-1;j++)
- {
- insertchangestate(j,processed);
- insertchangestate(j+1,processed);
- insertsleep(REDRAWDELAY);
- if(array[j]>array[j+1])
- {
- swap(j,j+1);
- }
- insertchangestate(j,normal);
- insertchangestate(j+1,normal);
- insertsleep(REDRAWDELAY);
- }
- insertchangestate(j,inplace);
- insertsleep(REDRAWDELAY);
- }
- #elif QUICKSORT
- quicksort(N-1,array,0);
- #endif
- }
- void quicksort(int n,int *a,int offset)
- {
- int i=0,j=n,k;
- int p=a[n>>1];
- for(k=0;k<=n;k++)
- {
- insertchangestate(k+offset,activeinterval);
- }
- insertsleep(REDRAWDELAY);
- insertchangestate(i+offset,processed);
- insertchangestate(j+offset,processed);
- do
- {
- while(a[i]<p)
- {
- insertchangestate(i+offset,activeinterval);
- i++;
- if(i<=j)insertchangestate(i+offset,processed);
- insertsleep(REDRAWDELAY);
- }
- insertsleep(REDRAWDELAY);
- while(a[j]>p)
- {
- insertchangestate(j+offset,activeinterval);
- j--;
- if(i<=j)insertchangestate(j+offset,processed);
- insertsleep(REDRAWDELAY);
- }
- insertsleep(REDRAWDELAY);
- if(i<=j)
- {
- swap(offset+i,offset+j);
- insertchangestate(i+offset,activeinterval);
- insertchangestate(j+offset,activeinterval);
- i++;
- j--;
- if(i<=j)
- {
- insertchangestate(i+offset,processed);
- insertchangestate(j+offset,processed);
- insertsleep(REDRAWDELAY);
- }
- }
- }
- while(i<=j);
- for(k=0;k<=n;k++)
- {
- insertchangestate(k+offset,normal);
- }
- if(j>0) quicksort(j,a,offset);
- if(i<n) quicksort(n-i,a+i,offset+i);
- }
- gboolean delete_event(GtkWidget *w,GdkEvent *e, gpointer data)
- {
- gtk_main_quit();
- return TRUE;
- }
Add Comment
Please, Sign In to add comment