java课设合并排序动态演示.docx
《java课设合并排序动态演示.docx》由会员分享,可在线阅读,更多相关《java课设合并排序动态演示.docx(21页珍藏版)》请在冰豆网上搜索。
java课设合并排序动态演示
目录
1.需求分析
1.1设计任务..........................................................................2
1.1项目背景..........................................................................2
二.概要设计
2.1类设计..............................................................................3
2.2系统流程..........................................................................3
2.3系统模块..........................................................................3
三.详细设计
3.1各模块的实现方法............................................................5
3.2程序流程............................................................................13
3.3系统界面............................................................................16
4.调试分析
五.用户使用及说明
六.测试结果
2.需求分析
1.1设计任务
本系统为合并排序的演示展示程序,分为界面设计和算法设计两大部分,通过Java的GUI图形用户界面演示合并排序的算法原理,实现排序算法的动态演示。
要求完成:
(1)理解并实现合并排序算法
(2)使用界面完成合并排序算法的演示
(3)动态跟踪排序
1.2项目背景
为加深对理论教学内容的理解,掌握图形界面设计,熟悉java.awt包的组件,掌握图形界面设计方法,理解事件处理模型,检测对这门课的掌握情况。
有助于及时查漏补缺,使学生系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,并在实践应用方面打下一定基础,开展合并排序的算法演示课程设计。
合并排序算法是归并排序的一种,主要是利用递归算法进行排序算法的动态演示。
2.1.类设计
2.2.系统流程
2.2.1用户通过主界面在排序区输入要合并排序的字符串
2.2.2开始排序,演示区实时显示当前排序的子字符串
2.2.3动态演示排序过程
2.2.4显示排序的实时结果
2.3.系统模块
2.3.1主类(CMain)程序的入口,创建窗体函数对象
2.3.2主界面窗体类(CWin)构造用户GUI图形界面,合并排序算法的前台演示排序过程
2.3.3合并排序算法实现类(CMergeSort)将文本框控件传来的数据进行合并排序
2.3.4跟踪界面窗体类(CStateWin)动态演示程序运行到某一处代码段
2.3.5等待同步类(Wait)实现前台后台数据同步。
3.1各模块的实现方法:
3.1.1主类(CMain)实现方法:
主方法publicstaticvoidstaticvoidmain(String[]args){},创建窗体函数对象;
3.1.2主界面窗体类(CWin)实现方法:
PublicclassCWinextendsJFrameimplementsActionListener,MouseListener,Runnable{
CWin()1.完成窗体控件的声明和初始化,2.设置控件的摆放位置3.增加事件监听
privatevoidInittialization()初始化窗体控件,为排序类(CMergeSort)的静态标记为赋初值
PrivateStringGetRanDomSequence()产生随机序列数据,传入输入文本框
privatevoidStartMergeSort()排序及演示
{
intmid=0,i;
StringstrTemp=txtInput1.getText();
for(i=0;i{if(strTemp.charAt(i)==','||strTemp.charAt(i)==','){mid++;}}strTemp=strTemp+","+txtInput2.getText();if(strTemp.length()<1)return;strTemp=strTemp.replace(",",",");//??????','????????','strTemp=strTemp.replace("","");//????Stringdata[]=strTemp.split(",");if(data.length>MaxElement){JOptionPane.showMessageDialog(this,"???????????????????"+String.valueOf(MaxElement)+"?","??",JOptionPane.PLAIN_MESSAGE);return;}elseif(data.length<2){JOptionPane.showMessageDialog(this,"????????2???","??",JOptionPane.PLAIN_MESSAGE);return;}btnRun.setText("??");CMergeSort.isSuspend=false;CMergeSort.isChange=false;CMergeSort.isRefresh=false;CMergeSort.isOver=true;CMergeSort.intChangeSrc=-1;CMergeSort.intChangeDes=-1;CMergeSort.intCount=0;CMergeSort.strHandle="????";intUsedElement=data.length;for(i=0;i{btnDemonstrate[i].setText("-");btnDemonstrate[i].setVisible(false);}win_w=this.getWidth();win_h=this.getHeight();for(i=0;i{btnDemonstrate[i].setText(data[i]);btnDemonstrate[i].setBounds(win_w/(2+3*intUsedElement)+i*win_w/(intUsedElement+1),intDefY,win_w/(intUsedElement+1),win_h/(intUsedElement+1));btnDemonstrate[i].setVisible(true);}//??????txtDemonstrate.setText("????:"+Arrays.toString(data)+"\n????:????"+"\n????:"+String.valueOf(CMergeSort.intCount));MergeTwoList(mid);CMergeSortcms=newCMergeSort(data);Threadthd=newThread(cms);thd.start();//????????????WaitTime();//????????????????????????????????while(!CMergeSort.isOver){if(CMergeSort.isChange){MoveElement();txtDemonstrate.setText("????:"+Arrays.toString(CMergeSort.data_image)+"\n????:"+CMergeSort.strHandle+"\n????:"+String.valueOf(CMergeSort.intCount));//???????txtDemonstrate????????????CMergeSort.isChange=false;}elseif(CMergeSort.isRefresh){Refresh();txtDemonstrate.setText("????:+"\n????:"+CMergeSort.strHandle+"\n????:"+String.valueOf(CMergeSort.intCount));}WaitTime();}btnRun.setText("??");}}privatevoidRefresh()与后台同步数据privatevoidMoveElement()动态演示排序数据privatevoidMoveElement(){if(CMergeSort.intStart!=-1&&CMergeSort.intEnd!=-1){//??????MoveDown(CMergeSort.intStart,CMergeSort.intEnd);CMergeSort.intStart=-1;CMergeSort.intEnd=-1;}elseif(CMergeSort.intStart==-2){//??????????if(csw!=null)csw.setState(CMergeSort.intStatement);CMergeSort.intStart=-1;}else{//????MoveUp(CMergeSort.intChangeSrc,CMergeSort.intChangeDes);}}privatevoidMoveDown(intindexS,intindexE)将一组待比较的节点向下移动privatevoidMoveUp(intindex,intdes)???????????privatevoidWaitTime()??}3.1.3合并排序算法实现类(CMergeSort)实现方法:publicclassCMergeSortimplementsRunnable{publicCMergeSort(String[]data)????,承接输入文本框传入的函数publicvoidrun()??privatevoidMergeSort(String[]data)??????privatevoidMSort(String[]data,String[]temp,intstart,intend)????:?data[]??????temp[]???????????privatevoidMerge(String[]data,String[]temp,intstart,intmid,intend)???????????temp[start,mid],temp[mid+1,end]??????data[]privateintstrcmp(Stringstr1,Stringstr2)?????????privatevoidWaitForFlag()??privatevoidWaitTime(){Wait.sleep(CMergeSort.intInterval);}privatevoidWaitLongTime()//?????????????????{Wait.sleep(CMergeSort.intInterval*20);}} 3.1.4跟踪界面窗体类(CStateWin)实现方法:publicclassCStateWinextendsJFrame{JListlstStatement;//?????String[]statement={"intj,k;","for(j=mid+1,k=start;start<=mid&&j<=end;++k)","{","if(strcmp(temp[start],temp[j])<=0)","{","data[k]=temp[start++];","}","else","{","data[k]=temp[j++];","}","}","if(start<=mid)","{","for(inti0=start;i0<=mid;i0++)","{","data[k++]=temp[start++];","}","}","if(j<=end)","{","for(intj0=j;j0<=end;j0++)","{","data[k++]=temp[j++];","}","}"};intwin_w=400;intwin_h=600;CStartWin()构造函数,声明控件,演示跟踪}3.1.5等待同步类(Wait)实现方法:publicclassWait{publicstaticvoidsleep(inttime){try{Thread.sleep(time);}catch(Exceptionex){}}3.2程序流程:3.3系统界面:四.调试分析1.在实现演示实验过程的过程中,不知道如何实现线程同步,经过多方查取资料,发现通过修改标志位即可。2.在调试过程中发现数据前台后台不一致重新确定了排序算法的设计方法:主窗口是前台,排序算法是后台,先把两个数组合二为一,再把要排序数组给后台,然后后台就开始调用算法前台就不停的检查标志位,发现被修改了就表示要移动动画了然后前台这边就移动动画,移动完了再把标志位改回去,那边暂停以后也在不停的检查标志位,发现标记被修改了就退出暂停,继续下一步,就这样直到排序完了,再修改标志位,后台指导前台完成了,然后把前台的数组拿出来就是排序结果了。 五.用户使用及说明程序运行后,用户可以通过在输入文本框中输入待排序的数据或自动产生随机数来进行排序算法的演示,完成数据输入后点击排序按钮即可排序现对照下图进行讲解:操作区显示的是待排序的两串数据及相关操作:排序/暂停,恢复,随机,分别对应两串数据合并排序,暂停排序,恢复初始状态,随机产生待排数据;演示区显示排序的实时状态,分别为当前排序数组,显示当前操作及当前比较次数;演示区的按钮动态演示排序过程,将要排序的数组向下移动变为黄色。演示区按钮由黄变绿表示这一组的排序完成,红色表示将进行下一组的排序,按合并算法进行新一轮的排序。蓝色为未排序的数组。当按钮全部变绿即为排序演示完成。当用户希望清除数据点击恢复即可完成效果如图:用户单击查看——>查看函数即可观看程序代码段的运行的具体执行语句处,动态展示算法的执行情况:六.测试结果七.代码附:程序部分代码/***************************************************************类功能:提供合并排序**************************************************************/publicclassCMergeSortimplementsRunnable{//线程是否结束staticbooleanisOver=true;//是否交换staticbooleanisChange=false;//是否交换完成staticbooleanisRefresh=false;//交换起始位置staticintintStart=-1;//交换终点位置staticintintEnd=-1;//交换源staticintintChangeSrc=-1;//交换位置staticintintChangeDes=-1;//当前操作staticStringstrHandle="";//比较次数staticintintCount=0;//是否暂停staticbooleanisSuspend=false;//检测休眠时间staticintintInterval=30;//待排序序列镜像staticString[]data_image;/***********************************************************函数功能:构造函数*输入:待排序序列*输出:无**********************************************************/publicCMergeSort(String[]data){data_image=newString[data.length];System.arraycopy(data,0,data_image,0,data.length);}/***********************************************************线程**********************************************************/publicvoidrun(){isOver=false;isChange=false;MergeSort(data_image);isOver=true;}/***********************************************************函数功能:启动合并排序*注意:根据字符排序,所以输入可以是数字也可以是字母,当数字和字母比较时比较ASCII*比如10和a比较10>a,10和a0比较10*输入:序列*输出:排序后序列**********************************************************/privatevoidMergeSort(String[]data){String[]data_cpy=newString[data.length];System.arraycopy(data,0,data_cpy,0,data.length);//Function(data_cpy,data,0,data.length);MSort(data,data_cpy,0,data.length-1);strHandle="排序完成";WaitForRefresh();}/***********************************************************函数功能:合并排序_测试用函数*输入:字符串1,字符串2,起始位置,终止位置*输出:无**********************************************************/privatevoidFunction_test(String[]src,String[]dest,intstart,intend){if(end-start>1){intmid=(start+end)/2;Function_test(dest,src,start,mid);Function_test(dest,src,mid,end);intStart=start;intEnd=end;for(inti=start,j=mid,k=start;k{if(j>=end||i{dest[k]=src[i++];}else{dest[k]=src[j++];}isChange=true;if(isOver)return;WaitForFlag();}}}/***********************************************************函数功能:合并排序*输入:字符串1,字符串2,起始位置,终
if(strTemp.charAt(i)==','||strTemp.charAt(i)==',')
mid++;
}
strTemp=strTemp+","+txtInput2.getText();
if(strTemp.length()<1)
return;
strTemp=strTemp.replace(",",",");//?
?
','?
','
strTemp=strTemp.replace("","");//?
Stringdata[]=strTemp.split(",");
if(data.length>MaxElement)
JOptionPane.showMessageDialog(this,"?
"+
String.valueOf(MaxElement)+"?
","?
",JOptionPane.PLAIN_MESSAGE);
elseif(data.length<2)
2?
btnRun.setText("?
");
CMergeSort.isSuspend=false;
CMergeSort.isChange=false;
CMergeSort.isRefresh=false;
CMergeSort.isOver=true;
CMergeSort.intChangeSrc=-1;
CMergeSort.intChangeDes=-1;
CMergeSort.intCount=0;
CMergeSort.strHandle="?
";
intUsedElement=data.length;
for(i=0;i{btnDemonstrate[i].setText("-");btnDemonstrate[i].setVisible(false);}win_w=this.getWidth();win_h=this.getHeight();for(i=0;i{btnDemonstrate[i].setText(data[i]);btnDemonstrate[i].setBounds(win_w/(2+3*intUsedElement)+i*win_w/(intUsedElement+1),intDefY,win_w/(intUsedElement+1),win_h/(intUsedElement+1));btnDemonstrate[i].setVisible(true);}//??????txtDemonstrate.setText("????:"+Arrays.toString(data)+"\n????:????"+"\n????:"+String.valueOf(CMergeSort.intCount));MergeTwoList(mid);CMergeSortcms=newCMergeSort(data);Threadthd=newThread(cms);thd.start();//????????????WaitTime();//????????????????????????????????while(!CMergeSort.isOver){if(CMergeSort.isChange){MoveElement();txtDemonstrate.setText("????:"+Arrays.toString(CMergeSort.data_image)+"\n????:"+CMergeSort.strHandle+"\n????:"+String.valueOf(CMergeSort.intCount));//???????txtDemonstrate????????????CMergeSort.isChange=false;}elseif(CMergeSort.isRefresh){Refresh();txtDemonstrate.setText("????:+"\n????:"+CMergeSort.strHandle+"\n????:"+String.valueOf(CMergeSort.intCount));}WaitTime();}btnRun.setText("??");}}privatevoidRefresh()与后台同步数据privatevoidMoveElement()动态演示排序数据privatevoidMoveElement(){if(CMergeSort.intStart!=-1&&CMergeSort.intEnd!=-1){//??????MoveDown(CMergeSort.intStart,CMergeSort.intEnd);CMergeSort.intStart=-1;CMergeSort.intEnd=-1;}elseif(CMergeSort.intStart==-2){//??????????if(csw!=null)csw.setState(CMergeSort.intStatement);CMergeSort.intStart=-1;}else{//????MoveUp(CMergeSort.intChangeSrc,CMergeSort.intChangeDes);}}privatevoidMoveDown(intindexS,intindexE)将一组待比较的节点向下移动privatevoidMoveUp(intindex,intdes)???????????privatevoidWaitTime()??}3.1.3合并排序算法实现类(CMergeSort)实现方法:publicclassCMergeSortimplementsRunnable{publicCMergeSort(String[]data)????,承接输入文本框传入的函数publicvoidrun()??privatevoidMergeSort(String[]data)??????privatevoidMSort(String[]data,String[]temp,intstart,intend)????:?data[]??????temp[]???????????privatevoidMerge(String[]data,String[]temp,intstart,intmid,intend)???????????temp[start,mid],temp[mid+1,end]??????data[]privateintstrcmp(Stringstr1,Stringstr2)?????????privatevoidWaitForFlag()??privatevoidWaitTime(){Wait.sleep(CMergeSort.intInterval);}privatevoidWaitLongTime()//?????????????????{Wait.sleep(CMergeSort.intInterval*20);}} 3.1.4跟踪界面窗体类(CStateWin)实现方法:publicclassCStateWinextendsJFrame{JListlstStatement;//?????String[]statement={"intj,k;","for(j=mid+1,k=start;start<=mid&&j<=end;++k)","{","if(strcmp(temp[start],temp[j])<=0)","{","data[k]=temp[start++];","}","else","{","data[k]=temp[j++];","}","}","if(start<=mid)","{","for(inti0=start;i0<=mid;i0++)","{","data[k++]=temp[start++];","}","}","if(j<=end)","{","for(intj0=j;j0<=end;j0++)","{","data[k++]=temp[j++];","}","}"};intwin_w=400;intwin_h=600;CStartWin()构造函数,声明控件,演示跟踪}3.1.5等待同步类(Wait)实现方法:publicclassWait{publicstaticvoidsleep(inttime){try{Thread.sleep(time);}catch(Exceptionex){}}3.2程序流程:3.3系统界面:四.调试分析1.在实现演示实验过程的过程中,不知道如何实现线程同步,经过多方查取资料,发现通过修改标志位即可。2.在调试过程中发现数据前台后台不一致重新确定了排序算法的设计方法:主窗口是前台,排序算法是后台,先把两个数组合二为一,再把要排序数组给后台,然后后台就开始调用算法前台就不停的检查标志位,发现被修改了就表示要移动动画了然后前台这边就移动动画,移动完了再把标志位改回去,那边暂停以后也在不停的检查标志位,发现标记被修改了就退出暂停,继续下一步,就这样直到排序完了,再修改标志位,后台指导前台完成了,然后把前台的数组拿出来就是排序结果了。 五.用户使用及说明程序运行后,用户可以通过在输入文本框中输入待排序的数据或自动产生随机数来进行排序算法的演示,完成数据输入后点击排序按钮即可排序现对照下图进行讲解:操作区显示的是待排序的两串数据及相关操作:排序/暂停,恢复,随机,分别对应两串数据合并排序,暂停排序,恢复初始状态,随机产生待排数据;演示区显示排序的实时状态,分别为当前排序数组,显示当前操作及当前比较次数;演示区的按钮动态演示排序过程,将要排序的数组向下移动变为黄色。演示区按钮由黄变绿表示这一组的排序完成,红色表示将进行下一组的排序,按合并算法进行新一轮的排序。蓝色为未排序的数组。当按钮全部变绿即为排序演示完成。当用户希望清除数据点击恢复即可完成效果如图:用户单击查看——>查看函数即可观看程序代码段的运行的具体执行语句处,动态展示算法的执行情况:六.测试结果七.代码附:程序部分代码/***************************************************************类功能:提供合并排序**************************************************************/publicclassCMergeSortimplementsRunnable{//线程是否结束staticbooleanisOver=true;//是否交换staticbooleanisChange=false;//是否交换完成staticbooleanisRefresh=false;//交换起始位置staticintintStart=-1;//交换终点位置staticintintEnd=-1;//交换源staticintintChangeSrc=-1;//交换位置staticintintChangeDes=-1;//当前操作staticStringstrHandle="";//比较次数staticintintCount=0;//是否暂停staticbooleanisSuspend=false;//检测休眠时间staticintintInterval=30;//待排序序列镜像staticString[]data_image;/***********************************************************函数功能:构造函数*输入:待排序序列*输出:无**********************************************************/publicCMergeSort(String[]data){data_image=newString[data.length];System.arraycopy(data,0,data_image,0,data.length);}/***********************************************************线程**********************************************************/publicvoidrun(){isOver=false;isChange=false;MergeSort(data_image);isOver=true;}/***********************************************************函数功能:启动合并排序*注意:根据字符排序,所以输入可以是数字也可以是字母,当数字和字母比较时比较ASCII*比如10和a比较10>a,10和a0比较10*输入:序列*输出:排序后序列**********************************************************/privatevoidMergeSort(String[]data){String[]data_cpy=newString[data.length];System.arraycopy(data,0,data_cpy,0,data.length);//Function(data_cpy,data,0,data.length);MSort(data,data_cpy,0,data.length-1);strHandle="排序完成";WaitForRefresh();}/***********************************************************函数功能:合并排序_测试用函数*输入:字符串1,字符串2,起始位置,终止位置*输出:无**********************************************************/privatevoidFunction_test(String[]src,String[]dest,intstart,intend){if(end-start>1){intmid=(start+end)/2;Function_test(dest,src,start,mid);Function_test(dest,src,mid,end);intStart=start;intEnd=end;for(inti=start,j=mid,k=start;k{if(j>=end||i{dest[k]=src[i++];}else{dest[k]=src[j++];}isChange=true;if(isOver)return;WaitForFlag();}}}/***********************************************************函数功能:合并排序*输入:字符串1,字符串2,起始位置,终
btnDemonstrate[i].setText("-");
btnDemonstrate[i].setVisible(false);
win_w=this.getWidth();
win_h=this.getHeight();
for(i=0;i{btnDemonstrate[i].setText(data[i]);btnDemonstrate[i].setBounds(win_w/(2+3*intUsedElement)+i*win_w/(intUsedElement+1),intDefY,win_w/(intUsedElement+1),win_h/(intUsedElement+1));btnDemonstrate[i].setVisible(true);}//??????txtDemonstrate.setText("????:"+Arrays.toString(data)+"\n????:????"+"\n????:"+String.valueOf(CMergeSort.intCount));MergeTwoList(mid);CMergeSortcms=newCMergeSort(data);Threadthd=newThread(cms);thd.start();//????????????WaitTime();//????????????????????????????????while(!CMergeSort.isOver){if(CMergeSort.isChange){MoveElement();txtDemonstrate.setText("????:"+Arrays.toString(CMergeSort.data_image)+"\n????:"+CMergeSort.strHandle+"\n????:"+String.valueOf(CMergeSort.intCount));//???????txtDemonstrate????????????CMergeSort.isChange=false;}elseif(CMergeSort.isRefresh){Refresh();txtDemonstrate.setText("????:+"\n????:"+CMergeSort.strHandle+"\n????:"+String.valueOf(CMergeSort.intCount));}WaitTime();}btnRun.setText("??");}}privatevoidRefresh()与后台同步数据privatevoidMoveElement()动态演示排序数据privatevoidMoveElement(){if(CMergeSort.intStart!=-1&&CMergeSort.intEnd!=-1){//??????MoveDown(CMergeSort.intStart,CMergeSort.intEnd);CMergeSort.intStart=-1;CMergeSort.intEnd=-1;}elseif(CMergeSort.intStart==-2){//??????????if(csw!=null)csw.setState(CMergeSort.intStatement);CMergeSort.intStart=-1;}else{//????MoveUp(CMergeSort.intChangeSrc,CMergeSort.intChangeDes);}}privatevoidMoveDown(intindexS,intindexE)将一组待比较的节点向下移动privatevoidMoveUp(intindex,intdes)???????????privatevoidWaitTime()??}3.1.3合并排序算法实现类(CMergeSort)实现方法:publicclassCMergeSortimplementsRunnable{publicCMergeSort(String[]data)????,承接输入文本框传入的函数publicvoidrun()??privatevoidMergeSort(String[]data)??????privatevoidMSort(String[]data,String[]temp,intstart,intend)????:?data[]??????temp[]???????????privatevoidMerge(String[]data,String[]temp,intstart,intmid,intend)???????????temp[start,mid],temp[mid+1,end]??????data[]privateintstrcmp(Stringstr1,Stringstr2)?????????privatevoidWaitForFlag()??privatevoidWaitTime(){Wait.sleep(CMergeSort.intInterval);}privatevoidWaitLongTime()//?????????????????{Wait.sleep(CMergeSort.intInterval*20);}} 3.1.4跟踪界面窗体类(CStateWin)实现方法:publicclassCStateWinextendsJFrame{JListlstStatement;//?????String[]statement={"intj,k;","for(j=mid+1,k=start;start<=mid&&j<=end;++k)","{","if(strcmp(temp[start],temp[j])<=0)","{","data[k]=temp[start++];","}","else","{","data[k]=temp[j++];","}","}","if(start<=mid)","{","for(inti0=start;i0<=mid;i0++)","{","data[k++]=temp[start++];","}","}","if(j<=end)","{","for(intj0=j;j0<=end;j0++)","{","data[k++]=temp[j++];","}","}"};intwin_w=400;intwin_h=600;CStartWin()构造函数,声明控件,演示跟踪}3.1.5等待同步类(Wait)实现方法:publicclassWait{publicstaticvoidsleep(inttime){try{Thread.sleep(time);}catch(Exceptionex){}}3.2程序流程:3.3系统界面:四.调试分析1.在实现演示实验过程的过程中,不知道如何实现线程同步,经过多方查取资料,发现通过修改标志位即可。2.在调试过程中发现数据前台后台不一致重新确定了排序算法的设计方法:主窗口是前台,排序算法是后台,先把两个数组合二为一,再把要排序数组给后台,然后后台就开始调用算法前台就不停的检查标志位,发现被修改了就表示要移动动画了然后前台这边就移动动画,移动完了再把标志位改回去,那边暂停以后也在不停的检查标志位,发现标记被修改了就退出暂停,继续下一步,就这样直到排序完了,再修改标志位,后台指导前台完成了,然后把前台的数组拿出来就是排序结果了。 五.用户使用及说明程序运行后,用户可以通过在输入文本框中输入待排序的数据或自动产生随机数来进行排序算法的演示,完成数据输入后点击排序按钮即可排序现对照下图进行讲解:操作区显示的是待排序的两串数据及相关操作:排序/暂停,恢复,随机,分别对应两串数据合并排序,暂停排序,恢复初始状态,随机产生待排数据;演示区显示排序的实时状态,分别为当前排序数组,显示当前操作及当前比较次数;演示区的按钮动态演示排序过程,将要排序的数组向下移动变为黄色。演示区按钮由黄变绿表示这一组的排序完成,红色表示将进行下一组的排序,按合并算法进行新一轮的排序。蓝色为未排序的数组。当按钮全部变绿即为排序演示完成。当用户希望清除数据点击恢复即可完成效果如图:用户单击查看——>查看函数即可观看程序代码段的运行的具体执行语句处,动态展示算法的执行情况:六.测试结果七.代码附:程序部分代码/***************************************************************类功能:提供合并排序**************************************************************/publicclassCMergeSortimplementsRunnable{//线程是否结束staticbooleanisOver=true;//是否交换staticbooleanisChange=false;//是否交换完成staticbooleanisRefresh=false;//交换起始位置staticintintStart=-1;//交换终点位置staticintintEnd=-1;//交换源staticintintChangeSrc=-1;//交换位置staticintintChangeDes=-1;//当前操作staticStringstrHandle="";//比较次数staticintintCount=0;//是否暂停staticbooleanisSuspend=false;//检测休眠时间staticintintInterval=30;//待排序序列镜像staticString[]data_image;/***********************************************************函数功能:构造函数*输入:待排序序列*输出:无**********************************************************/publicCMergeSort(String[]data){data_image=newString[data.length];System.arraycopy(data,0,data_image,0,data.length);}/***********************************************************线程**********************************************************/publicvoidrun(){isOver=false;isChange=false;MergeSort(data_image);isOver=true;}/***********************************************************函数功能:启动合并排序*注意:根据字符排序,所以输入可以是数字也可以是字母,当数字和字母比较时比较ASCII*比如10和a比较10>a,10和a0比较10*输入:序列*输出:排序后序列**********************************************************/privatevoidMergeSort(String[]data){String[]data_cpy=newString[data.length];System.arraycopy(data,0,data_cpy,0,data.length);//Function(data_cpy,data,0,data.length);MSort(data,data_cpy,0,data.length-1);strHandle="排序完成";WaitForRefresh();}/***********************************************************函数功能:合并排序_测试用函数*输入:字符串1,字符串2,起始位置,终止位置*输出:无**********************************************************/privatevoidFunction_test(String[]src,String[]dest,intstart,intend){if(end-start>1){intmid=(start+end)/2;Function_test(dest,src,start,mid);Function_test(dest,src,mid,end);intStart=start;intEnd=end;for(inti=start,j=mid,k=start;k{if(j>=end||i{dest[k]=src[i++];}else{dest[k]=src[j++];}isChange=true;if(isOver)return;WaitForFlag();}}}/***********************************************************函数功能:合并排序*输入:字符串1,字符串2,起始位置,终
btnDemonstrate[i].setText(data[i]);
btnDemonstrate[i].setBounds(win_w/(2+3*intUsedElement)+i*win_w/(intUsedElement+1),intDefY,win_w/(intUsedElement+1),win_h/(intUsedElement+1));
btnDemonstrate[i].setVisible(true);
//?
txtDemonstrate.setText("?
:
"+Arrays.toString(data)
+"\n?
"
"+String.valueOf(CMergeSort.intCount));
MergeTwoList(mid);
CMergeSortcms=newCMergeSort(data);
Threadthd=newThread(cms);
thd.start();
WaitTime();
while(!
CMergeSort.isOver)
if(CMergeSort.isChange)
MoveElement();
"+Arrays.toString(CMergeSort.data_image)
"+CMergeSort.strHandle
txtDemonstrate?
elseif(CMergeSort.isRefresh)
Refresh();
privatevoidRefresh()与后台同步数据
privatevoidMoveElement()动态演示排序数据
privatevoidMoveElement()
if(CMergeSort.intStart!
=-1&&CMergeSort.intEnd!
=-1)
{//?
MoveDown(CMergeSort.intStart,CMergeSort.intEnd);
CMergeSort.intStart=-1;
CMergeSort.intEnd=-1;
elseif(CMergeSort.intStart==-2)
if(csw!
=null)
csw.setState(CMergeSort.intStatement);
else
MoveUp(CMergeSort.intChangeSrc,CMergeSort.intChangeDes);
privatevoidMoveDown(intindexS,intindexE)将一组待比较的节点向下移动
privatevoidMoveUp(intindex,intdes)?
privatevoidWaitTime()?
3.1.3合并排序算法实现类(CMergeSort)实现方法:
publicclassCMergeSortimplementsRunnable{
publicCMergeSort(String[]data)?
,承接输入文本框传入的函数
publicvoidrun()?
privatevoidMergeSort(String[]data)?
privatevoidMSort(String[]data,String[]temp,intstart,intend)?
data[]?
temp[]?
privatevoidMerge(String[]data,String[]temp,intstart,intmid,intend)?
temp[start,mid],temp[mid+1,end]?
data[]
privateintstrcmp(Stringstr1,Stringstr2)?
privatevoidWaitForFlag()?
privatevoidWaitTime()
Wait.sleep(CMergeSort.intInterval);
privatevoidWaitLongTime()//?
Wait.sleep(CMergeSort.intInterval*20);
3.1.4跟踪界面窗体类(CStateWin)实现方法:
publicclassCStateWinextendsJFrame
JListlstStatement;
String[]statement={
"intj,k;",
"for(j=mid+1,k=start;start<=mid&&j<=end;++k)",
"{",
"if(strcmp(temp[start],temp[j])<=0)",
"data[k]=temp[start++];",
"}",
"else",
"data[k]=temp[j++];",
"if(start<=mid)",
"for(inti0=start;i0<=mid;i0++)",
"data[k++]=temp[start++];",
"if(j<=end)",
"for(intj0=j;j0<=end;j0++)",
"data[k++]=temp[j++];",
"}"
};
intwin_w=400;
intwin_h=600;CStartWin()构造函数,声明控件,演示跟踪
3.1.5等待同步类(Wait)实现方法:
publicclassWait
publicstaticvoidsleep(inttime)
try
Thread.sleep(time);
catch(Exceptionex)
3.2程序流程:
3.3系统界面:
四.调试分析
1.在实现演示实验过程的过程中,不知道如何实现线程同步,经过多方查取资料,发现通过修改标志位即可。
2.在调试过程中发现数据前台后台不一致重新确定了排序算法的设计方法:
主窗口是前台,排序算法是后台,先把两个数组合二为一,再把要排序数组给后台,然后后台就开始调用算法前台就不停的检查标志位,发现被修改了就表示要移动动画了然后前台这边就移动动画,移动完了再把
标志位改回去,那边暂停以后也在不停的检查标志位,发现标记被修改了就退出暂停,继续下一步,就这样直到排序完了,再修改标志位,后台指导前台完成了,然后把前台的数组拿出来就是排序结果了。
程序运行后,用户可以通过在输入文本框中输入待排序的数据或自动产生随机数来进行排序算法的演示,完成数据输入后点击排序按钮即可排序现对照下图进行讲解:
操作区显示的是待排序的两串数据及相关操作:
排序/暂停,恢复,随机,分别对应两串数据合并排序,暂停排序,恢复初始状态,随机产生待排数据;演示区显示排序的实时状态,分别为当前排序数组,显示当前操作及当前比较次数;演示区的按钮动态演示排序过程,将要排序的数组向下移动变为黄色。
演示区按钮由黄变绿表示这一组的排序完成,红色表示将进行下一组的排序,按合并算法进行新一轮的排序。
蓝色为未排序的数组。
当按钮全部变绿即为排序演示完成。
当用户希望清除数据点击恢复即可完成效果如图:
用户单击查看——>查看函数即可观看程序代码段的运行的具体执行语句
处,动态展示算法的执行情况:
七.代码
附:
程序部分代码
/**************************************************************
*类功能:
提供合并排序
**************************************************************/
publicclassCMergeSortimplementsRunnable
//线程是否结束
staticbooleanisOver=true;
//是否交换
staticbooleanisChange=false;
//是否交换完成
staticbooleanisRefresh=false;
//交换起始位置
staticintintStart=-1;
//交换终点位置
staticintintEnd=-1;
//交换源
staticintintChangeSrc=-1;
//交换位置
staticintintChangeDes=-1;
//当前操作
staticStringstrHandle="";
//比较次数
staticintintCount=0;
//是否暂停
staticbooleanisSuspend=false;
//检测休眠时间
staticintintInterval=30;
//待排序序列镜像
staticString[]data_image;
/**********************************************************
*函数功能:
构造函数
*输入:
待排序序列
*输出:
无
**********************************************************/
publicCMergeSort(String[]data)
data_image=newString[data.length];
System.arraycopy(data,0,data_image,0,data.length);
*线程
publicvoidrun()
isOver=false;
isChange=false;
MergeSort(data_image);
isOver=true;
启动合并排序
*注意:
根据字符排序,所以输入可以是数字也可以是字母,当数字和字母比较时比较ASCII
*比如10和a比较10>a,10和a0比较10*输入:序列*输出:排序后序列**********************************************************/privatevoidMergeSort(String[]data){String[]data_cpy=newString[data.length];System.arraycopy(data,0,data_cpy,0,data.length);//Function(data_cpy,data,0,data.length);MSort(data,data_cpy,0,data.length-1);strHandle="排序完成";WaitForRefresh();}/***********************************************************函数功能:合并排序_测试用函数*输入:字符串1,字符串2,起始位置,终止位置*输出:无**********************************************************/privatevoidFunction_test(String[]src,String[]dest,intstart,intend){if(end-start>1){intmid=(start+end)/2;Function_test(dest,src,start,mid);Function_test(dest,src,mid,end);intStart=start;intEnd=end;for(inti=start,j=mid,k=start;k{if(j>=end||i{dest[k]=src[i++];}else{dest[k]=src[j++];}isChange=true;if(isOver)return;WaitForFlag();}}}/***********************************************************函数功能:合并排序*输入:字符串1,字符串2,起始位置,终
序列
排序后序列
privatevoidMergeSort(String[]data)
String[]data_cpy=newString[data.length];
System.arraycopy(data,0,data_cpy,0,data.length);
//Function(data_cpy,data,0,data.length);
MSort(data,data_cpy,0,data.length-1);
strHandle="排序完成";
WaitForRefresh();
/***********************************************************函数功能:
合并排序_测试用函数
字符串1,字符串2,起始位置,终止位置
privatevoidFunction_test(String[]src,String[]dest,intstart,intend)
if(end-start>1)
intmid=(start+end)/2;
Function_test(dest,src,start,mid);
Function_test(dest,src,mid,end);
intStart=start;
intEnd=end;
for(inti=start,j=mid,k=start;k{if(j>=end||i{dest[k]=src[i++];}else{dest[k]=src[j++];}isChange=true;if(isOver)return;WaitForFlag();}}}/***********************************************************函数功能:合并排序*输入:字符串1,字符串2,起始位置,终
if(j>=end||i{dest[k]=src[i++];}else{dest[k]=src[j++];}isChange=true;if(isOver)return;WaitForFlag();}}}/***********************************************************函数功能:合并排序*输入:字符串1,字符串2,起始位置,终
dest[k]=src[i++];
dest[k]=src[j++];
isChange=true;
if(isOver)
WaitForFlag();
合并排序
字符串1,字符串2,起始位置,终
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1