⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.java

📁 学习数据结构的最好辅助工具,快速帮助你熟悉数据结构的相关技术
💻 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 + -