数组挑选排序及其动画演示

数组挑选排序及其动画表示

众所周知,数组对于我们存放数据有着莫大的帮助,而在数组中,我们经常需要对其进行排序操作,今天,我们就一维数组的挑选排序方式对大家进行演示。
首先,挑选排序,其基本逻辑就是,第一轮中,选定数组第一个数,然后让它与其后面的每一个数进行比较,如果第一个数大于其比较的数,那就互换数据,第二轮就选定第二个数开始,第三轮就选定第三个,以此类推,我们就可以完成对数组的排序。
当然,我们老师的要求还有,用动画的方式,将排序过程表示出来。。。。(这难度突然增加)
总之既然需要给数组排序,我们就需要先创建一个数组并给其赋值,然后需要动画,我们就需要一个窗口来绘图。
所以,我们先把这些东西准备好

package array1109;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

public class arrayyry1 {
	
	//选择排序(完成
	int[] arr = new int[10];
	
	public void getarray(){
		
		Random ra = new Random();
		
		
		for(int i=0;i<arr.length;i++ ){
			
			arr[i]=ra.nextInt(30)+1;//给数组赋值
		}
		
		
	}
	public static void main(String[] args) {
		
		arrayyry1 a = new arrayyry1();
		
		JFrame ui=new JFrame();
		ui.setSize(900,900);
		ui.setLocationRelativeTo(null);
		ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ui.setLayout(new FlowLayout());
		
		JButton bt =new JButton("画图");
		JButton bt1 =new JButton("开始");
		
		ui.add(bt);
		ui.add(bt1);
		
		ui.setVisible(true);
		
		a.getarray();
		
		bt.addActionListener();
		bt1.addActionListener();
		}

这里,我们用方法为数组arr附了值,并且创建了一个窗口,并加上了两个按钮,接下来,我们就只需要为这两个按钮加入监听器,然后操作监听器就可以了。
所以,我们先为“画图”按钮写入监听器

//按下“画图”画出根据数组而来的图形
		bt.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				
				Graphics g1 =ui.getGraphics();//在ui界面创建一个画笔g1
				g1.setColor(Color.white);
				g1.fillRect(1, 80, 900, 800);//先将窗口的背景画为白色
				g1.setColor(Color.black);
				
				for(int i=0;i<10;i++){
					//循环画出每一个矩形,矩形宽40,两个矩形间隔40,第一个矩形从x=70开始画
					//然后我们确保每个矩形底在同一水平线上,我们使其左上角的y坐标与矩形高的和等于700
					g1.fillRect(70+i*80, 700-a.arr[i]*20, 40,a.arr[i]*20 );
					
					
				}
				
				
				
			}
		});

这样我们按下“画图”,就会根据我们的数组里数的大小生成高低不同的矩形,接下来,我们需要为工程量最大的“开始”按钮写入监听器。

bt1.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				//因为嵌套过多语句,特意表明级数,设此为第零级
				//第零级里,我们设定两个画笔,并让gw始终为白色(用于擦除)
				Graphics g1=ui.getGraphics();
				Graphics gw=ui.getGraphics();
				
				gw.setColor(Color.white);
				
				for (int i = 0;i<10;i++){
				//进入第一级循环,try语句里包含的是延迟操作,仅为观看方便,去除对函数效果无影响
				
					try {
						Thread.sleep(100);
					} catch (InterruptedException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

					//先选定(标蓝)每次循环第一个数组数据(矩形)
					g1.setColor(Color.blue);
					g1.fillRect(70+i*80, 700-a.arr[i]*20, 40,a.arr[i]*20 );
					
					
					for(int j=i+1;j<10;j++){
					//进入第二级循环,在选定(标蓝)了每一轮的第一个数据(矩形)之后,我们需要用它与后面
					//每一个数据(矩形)作大小(高低)的比较
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						
						//再依次选定(标蓝)每一个比较的数据(矩形)
						g1.setColor(Color.blue);
						g1.fillRect(70+j*80, 700-a.arr[j]*20, 40,a.arr[j]*20 );
						
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						
						//如果需要排序(即每轮的第一位数组大于其比较的数组),那就将二者交换数据(动画)
						if(a.arr[i]>a.arr[j]){
							//因为矩形中间可能会有其他矩形,如果让矩形直接平移可能会将其他矩形擦去
							//所以我们利用渐变色营造矩形突然消失又出现的“闪现”效果,避免矩形重叠导致擦去
							for(int k=0;k<31;k++){
							//进入第三级循环,这个循环是矩形的消失过程,简称消失循环
								try {
									Thread.sleep(20);
								} catch (InterruptedException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
								Color c = new Color((int)(8.5*k),(int)(8.5*k),255);
								g1.setColor(c);
								
								gw.fillRect(70+i*80+k-1, 700-a.arr[i]*20, 40,a.arr[i]*20 );
								gw.fillRect(70+j*80-k+1, 700-a.arr[j]*20, 40,a.arr[j]*20 );
								g1.fillRect(70+i*80+k, 700-a.arr[i]*20, 40,a.arr[i]*20 );
								g1.fillRect(70+j*80-k, 700-a.arr[j]*20, 40,a.arr[j]*20 );
							}
							
							try {
								Thread.sleep(200);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
							//这两行代码是擦去消失循环最后残留的两个矩形
							g1.fillRect(70+i*80+30, 700-a.arr[i]*20, 40,a.arr[i]*20 );
							g1.fillRect(70+j*80-30, 700-a.arr[j]*20, 40,a.arr[j]*20 );
							
							
							for(int k=30;k>=0;k--){
							//这是并列的第三极循环,为矩形出现过程,简称出现循环
								try {
									Thread.sleep(20);
								} catch (InterruptedException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
								Color c = new Color((int)(8.5*k),(int)(8.5*k),255);
								g1.setColor(c);
								
								gw.fillRect(70+j*80-k-1, 700-a.arr[i]*20, 40,a.arr[i]*20 );
								gw.fillRect(70+i*80+k+1, 700-a.arr[j]*20, 40,a.arr[j]*20 );
								g1.fillRect(70+j*80-k, 700-a.arr[i]*20, 40,a.arr[i]*20 );
								g1.fillRect(70+i*80+k, 700-a.arr[j]*20, 40,a.arr[j]*20 );
							}
							//动画完成后,我们交换数组数据的值,完成我们原本的目的
							int m=a.arr[i];
							a.arr[i]=a.arr[j];
							a.arr[j]=m;
						}
						//这部分属于第二级循环,我们需要在每次二级循环结束前将选定的比较数据(标蓝的矩形)
						//恢复成未选定状态(重新画黑),方面我们观看
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						g1.setColor(Color.BLACK);
						g1.fillRect(70+j*80, 700-a.arr[j]*20, 40,a.arr[j]*20 );
					}
					//这部分属于一级循环,我们需要在一级循环结束前,将每轮开始选定的数据(标蓝的矩形),
					//恢复成未选定状态(重新画黑),方便观看
					g1.setColor(Color.BLACK);
					g1.fillRect(70+i*80, 700-a.arr[i]*20, 40,a.arr[i]*20 );
					
				}
				
			}
		});

你可能感兴趣的:(数组挑选排序及其动画演示)