📄 demo.java
字号:
import java.awt.*;
public class Demo extends Canvas
{
private final int NO_START =-1;
private final int HAS_START =0;
private final int HAS_OVER =1;
private final int BX =20;
private final int BY =20;
private int DX =30;
private final int DY =15;
private final int WIDTH =20;
private final int HEIGHT =30;
private int m_nNum;
private int m_nIIndex;
private int m_nJIndex;
private int m_nLow;
private int m_nHigh;
private int m_nMid;
private int m_nCur;
private String m_sOldData;
private char[] m_sData =new char [12];
private int m_nStatus =NO_START;
private boolean m_bSortType =true;
private Graphics m_Graph;
private Graphics m_offG;
private Image m_offImg;
public void setData(String sData,boolean bool)
{
m_sOldData =sData;
m_bSortType =bool;
m_nStatus =NO_START;
m_nNum =m_sOldData.length ();
m_sData[0] =0x20;
if(m_nNum!=0)
DX =300/m_nNum;
else
DX=300;
for(int i=1;i<=m_nNum;i++)
m_sData[i]=sData.charAt (i-1);
m_nLow =1;
m_nHigh =1;
m_nJIndex =0;
m_nIIndex =0;
m_nMid =0;
m_nCur =0;
if(m_Graph==null) m_Graph=getGraphics();
}
private boolean compare(char ch1,char ch2)
{
if(m_bSortType)
return(ch1<ch2);
return(ch1>ch2);
}
public void init()
{
setData("",true);
m_Graph.clearRect (0,0,getSize().width ,getSize().height);
}
public int proceed(int nStep)
{
int nextStep=-1;
switch(nStep)
{
case -1://draw the init data
m_nStatus =HAS_START;
nextStep =0;
break;
case 0: //draw the init data and sorting data
nextStep =2;
m_nIIndex =1;
break;
case 2://
m_nIIndex++;
if(m_nIIndex>m_nNum)
nextStep=18;
else
nextStep=4;
break;
case 4://Move Node i->0
moveNode(m_sData[m_nIIndex],m_nIIndex,0,Color.gray,Color.yellow);
m_sData[0] =m_sData[m_nIIndex];
m_nCur =m_nIIndex;
nextStep =5;
break;
case 5:
m_nLow =1;
m_nHigh =m_nIIndex-1;
nextStep =6;
break;
case 6:
if(m_nLow<=m_nHigh)
nextStep=8;
else
nextStep=13;
break;
case 8:
m_nMid=(m_nLow+m_nHigh)/2;
nextStep =9;
break;
case 9:
for(int i=0;i<3;i++)
{
drawNode(m_sData[0],0,10,Color.red ,Color.yellow ,getGraphics());
drawNode(m_sData[m_nMid],m_nMid,10,Color.red ,Color.yellow ,getGraphics());
delay(120);
drawNode(m_sData[0],0,10,Color.cyan ,Color.yellow ,getGraphics());
drawNode(m_sData[m_nMid],m_nMid,10,getBackground() ,Color.yellow ,getGraphics());
delay(120);
}
if(compare(m_sData[0],m_sData[m_nMid]))
nextStep=10;
else
nextStep=12;
break;
case 10:
m_nHigh =m_nMid-1;
nextStep =6;
break;
case 12:
m_nLow =m_nMid+1;
nextStep =6;
break;
case 13:
nextStep =14;
m_nJIndex =m_nIIndex;
break;
case 14:
m_nJIndex--;
if(m_nJIndex>=m_nHigh+1)
nextStep=15;
else
nextStep=16;
break;
case 15:m_nCur=m_nJIndex;
m_sData[m_nJIndex+1]=m_sData[m_nJIndex];
nextStep =14;
break;
case 16:m_nCur=0;
moveNode(m_sData[0],0,m_nHigh+1,Color.gray ,Color.yellow );
m_sData[m_nHigh+1]=m_sData[0];
nextStep =17;
break;
case 17:nextStep=2;
break;
case 18://display the sorted result
m_nStatus=HAS_OVER;
nextStep=-1;
break;
}
repaint();
return nextStep;
}
public void paint(Graphics g)
{
m_offG.clearRect (0,0,getSize().width ,getSize().height );
switch(m_nStatus)
{
case NO_START://null paint
break;
case HAS_START://draw init data
drawData(false,m_offG);
drawNode(m_sData[0],0,10,Color.cyan ,Color.red ,m_offG);
Color color;
for(int i=1;i<m_nNum+1;i++)
{
if(m_nCur!=i)
{
if(i!=m_nIIndex&&i!=m_nJIndex)
color=Color.black ;
else
color=Color.yellow ;
drawNode(m_sData[i],i,10,getBackground(),color,m_offG);
}
}
if(m_nIIndex>=2)
drawArrow('i',m_nIIndex,10,Color.red,m_offG);
Color col=Color.blue ;
if(m_nLow>=0)
drawL('L',m_nLow,10,col,m_offG);
if(m_nHigh>=0)
drawH('H',m_nHigh,10,col,m_offG);
drawParam(m_offG);
g.drawImage (m_offImg,0,0,this);
break;
case HAS_OVER: drawData(true,m_offG); //draw init data
g.drawImage (m_offImg,0,0,this);
break;
}
}
public void update(Graphics g)
{
paint(g);
}
public void addNotify()
{
super.addNotify();
m_offImg = createImage(getSize().width, getSize().height);
m_offG = m_offImg.getGraphics();
}
private void drawParam(Graphics g)
{
if(m_nStatus==HAS_START)
{
String low ="Low = "+m_nLow;
String high ="High= "+m_nHigh;
String mid ="Mid = "+m_nMid;
g.drawString(low, BX, 250);
g.drawString(high, BX+80, 250);
g.drawString(mid, BX+160, 250);
}
}
private void drawData(boolean bool,Graphics g)
{
g.drawString ("初始数据:",BX,BY);
Color bk=getBackground();
for(int i=0;i<m_sOldData.length ();i++)
{
drawNode(m_sOldData.charAt (i),i+1,1,bk,Color.black ,g);
}
if(bool)
{
g.drawString ("排序结果:",BX,BY+DY*10-20);
for(int i=1;i<m_nNum+1;i++)
drawNode(m_sData[i],i,10,getBackground(),Color.black ,g);
}
}
private void drawNode(char ch,int i,int j,Color bkColor,Color fgColor,Graphics g)
{
Color old=g.getColor ();
g.drawRect (BX+i*DX, BY+j*DY, WIDTH, HEIGHT);
g.setColor (bkColor);
g.fillRect (BX+i*DX+1, BY+j*DY+1, WIDTH-1, HEIGHT-1);
char c[]={' ',' '}; c[0]=ch;
g.setColor (fgColor) ;
g.drawChars(c,0,1,BX+i*DX+WIDTH/3+1,BY+j*DY+HEIGHT*2/3);
g.setColor (old);
}
public void drawArrow(char ch,int i,int j,Color color,Graphics g)
{
Color old=g.getColor ();
g.setColor(color);
char c[]={' ',' '};
c[0]=ch;
int x=BX+i*DX+WIDTH/3+4;
int y=BY+j*DY+HEIGHT+5;
g.drawChars(c,0,1,x-8,y+15);
g.drawLine (x,y,x,y+25);
g.drawLine (x,y,x+2,y+5);
g.drawLine (x,y,x-3,y+5);
g.setColor (old);
}
public void drawL(char ch,int i,int j,Color color,Graphics g)
{
Color old=g.getColor();
g.setColor (color);
char c[]={' ',' '};
c[0]=ch;
int x=BX+i*DX+WIDTH/3;
int y=BY+j*DY+HEIGHT+5;
g.drawChars (c,0,1,x-8,y+15);
g.setColor(Color.red );
g.drawLine (x,y,x,y+25);
g.drawLine (x,y,x+2,y+5);
g.drawLine (x,y,x-3,y+5);
g.setColor (old);
}
public void drawH(char ch,int i,int j,Color color,Graphics g)
{
Color old=g.getColor();
g.setColor (color);
char c[]={' ',' '};
c[0]=ch;
int x=BX+i*DX+WIDTH/3+4;
int y=BY+(j-1)*DY+HEIGHT-45;
g.drawChars (c,0,1,x-8,y+15);
g.setColor(Color.red );
g.drawLine (x,y,x,y+25);
g.drawLine (x,y+25,x+2,y+20);
g.drawLine (x,y+25,x-3,y+20);
g.setColor (old);
}
public void moveNode(char ch,int start,int end,Color bkColor, Color fgColor)
{
Graphics g=getGraphics();
Color bk=getBackground();
Color old=g.getColor();
int ti=start;
int tj=end;
if(end==0)
{
ti=start;
tj=10;
while(tj>6)
{
g.setColor (bk);
g.fillRect (BX+ti*DX-1, BY+tj*DY-1, WIDTH+2, HEIGHT+2);
g.setColor(old);
drawNode(ch,ti,tj-1,bk,fgColor,g);
delay(50);
tj-=1;
}
while(ti>0)
{
g.setColor (bk);
g.fillRect (BX+ti*DX-1, BY+tj*DY-1, WIDTH+2, HEIGHT+2);
g.setColor(old);
drawNode(ch,ti-1,tj,bk,fgColor,g);
delay(50);
ti-=1;
}
while(tj<10)
{
g.setColor (bk);
g.fillRect (BX+ti*DX-1, BY+tj*DY-1, WIDTH+2, HEIGHT+2);
g.setColor(old);
drawNode(ch,ti,tj+1,bk,fgColor,g);
delay(50);
tj+=1;
}
}
else if(start==0)
{
ti=0;
tj=10;
while(tj>6)
{
g.setColor (bk);
g.fillRect (BX+ti*DX-1, BY+tj*DY-1, WIDTH+2, HEIGHT+2);
g.setColor(old);
drawNode(m_sData[0],0,10,Color.cyan,Color.yellow,g);
drawNode(ch,ti,tj-1,bk,fgColor,g);
delay(50);
tj-=1;
}
while(ti<end)
{
g.setColor (bk);
g.fillRect (BX+ti*DX-1, BY+tj*DY-1, WIDTH+2, HEIGHT+2);
g.setColor(old);
drawNode(ch,ti+1,tj,bk,fgColor,g);
delay(50);
ti+=1;
}
while(tj<10)
{
g.setColor (bk);
g.fillRect (BX+ti*DX-1, BY+tj*DY-1, WIDTH+2, HEIGHT+2);
g.setColor(old);
drawNode(ch,ti,tj+1,bk,fgColor,g);
delay(50);
tj+=1;
}
}
}
private void delay()
{
try{ Thread.sleep(80); }
catch(InterruptedException e){}
}
private void delay(int time)
{
try{ Thread.sleep(time); }
catch(InterruptedException e){}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -