java课设合并排序动态演示Word文档格式.docx
《java课设合并排序动态演示Word文档格式.docx》由会员分享,可在线阅读,更多相关《java课设合并排序动态演示Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
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<
strTemp.length();
i++)
if(strTemp.charAt(i)=='
'
||strTemp.charAt(i)=='
)
{
mid++;
}
}
strTemp=strTemp+"
"
+txtInput2.getText();
if(strTemp.length()<
1)
return;
strTemp=strTemp.replace("
"
);
//?
?
'
?
"
"
Stringdata[]=strTemp.split("
if(data.length>
MaxElement)
JOptionPane.showMessageDialog(this,"
?
+
String.valueOf(MaxElement)+"
JOptionPane.PLAIN_MESSAGE);
elseif(data.length<
2)
2?
JOptionPane.PLAIN_MESSAGE);
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;
i<
MaxElement;
i++)
btnDemonstrate[i].setText("
-"
btnDemonstrate[i].setVisible(false);
win_w=this.getWidth();
win_h=this.getHeight();
intUsedElement;
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();
txtDemonstrate.setText("
"
+Arrays.toString(CMergeSort.data_image)
+"
+CMergeSort.strHandle
"
//?
txtDemonstrate?
?
CMergeSort.isChange=false;
elseif(CMergeSort.isRefresh)
Refresh();
+"
WaitTime();
}
}
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<
a0
序列
排序后序列
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>
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<
end;
k++)
if(j>
=end||i<
mid&
strcmp(src[i],src[j])<
0)
dest[k]=src[i++];
else
dest[k]=src[j++];
isChange=true;
if(isOver)
return;
WaitForFlag();
合并排序
字符串1,字符串2,起始位置,终