java课设合并排序动态演示.docx

上传人:b****5 文档编号:5754662 上传时间:2022-12-31 格式:DOCX 页数:21 大小:386.98KB
下载 相关 举报
java课设合并排序动态演示.docx_第1页
第1页 / 共21页
java课设合并排序动态演示.docx_第2页
第2页 / 共21页
java课设合并排序动态演示.docx_第3页
第3页 / 共21页
java课设合并排序动态演示.docx_第4页
第4页 / 共21页
java课设合并排序动态演示.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

java课设合并排序动态演示.docx

《java课设合并排序动态演示.docx》由会员分享,可在线阅读,更多相关《java课设合并排序动态演示.docx(21页珍藏版)》请在冰豆网上搜索。

java课设合并排序动态演示.docx

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,起始位置,终

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1