java线程应用——排序过程动态显示

2 篇文章 0 订阅

设计思路:(用多线程并且每次交换数据都暂停1ms实现动态效果,顺便深入理解一下各类排序的特点)

       从各类选择中选择了7种排序,用动态效果展示排序过程。生成800个随机数(用图形描述的时候每个数占一个像素点)用ArrayList存储每个点的长度(此处用矩形来画线,方便以后宽度的更改),每种排序都用一个线程来执行,每次赋值(冒泡和2路太慢,所以做了适当修改)都暂停1ms,这样才能看清过程再写一个线程刷新JPanel的窗体。

      每个排序再写一个计算排序时间的类(线程)。测试了1000个,10000个,100000个的时间。

程序效果展示如下:



 

 

 



 



 

由于生成的随机数为了方便画出来,直接选的0-69的随机数,所以基数排序过程非常迅速,只要循环两次就可以排好。归并排序很明显的是一个一个合并起来。冒泡很明显的在一个一个的挑出来。堆排序明显在找到最大的往后面放。。。。。。(不代表排序时间)

 在计算时间的时候是生成的100000以内的随机数

 

贴出部分实现代码:

重绘:

public void paint(Graphics g) {
			super.paint(g);

			for (int i = 0; i < mplist.size(); i++) {
				Rect rc = mplist.get(i);
				rc.draw(g);
			}
............
}

 

加到ArrayList:(冒泡为例)

	public void Maopao() {
		for (int i = 0; i < a.length; i++) {
			for (int j = i + 1; j < a.length; j++) {

				if (a[i] > a[j]) {
					try {
						Thread.sleep(2);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					UI.mplist.remove(rc[i]);
					UI.mplist.remove(rc[j]);

					temp = a[i];
					a[i] = a[j];
					a[j] = temp;

					rc[i] = new Rect(x + i, y - a[i], 2, a[i], new Color(255,
							3 * a[i], 3 * a[i]));
					rc[j] = new Rect(x + j, y - a[j], 2, a[j], new Color(255,
							3 * a[j], 3 * a[j]));
					UI.mplist.add(rc[i]);
					UI.mplist.add(rc[j]);
				}
			}
		}

 

在构造方法中初始化数据:

public MaoPao(int a[]) {
		for (int i = 0; i < a.length; i++) {
			this.a[i] = a[i];
			rc[i] = new Rect(x + i, y - this.a[i], 2, this.a[i], new Color(255,
					3 * this.a[i], 3 * this.a[i]));
			UI.mplist.add(rc[i]);
		}
	}

 

 

刷新窗体的线程:

package v1;

import javax.swing.JPanel;
/**
 * 更新屏幕的线程
 * @author 斌
 *
 */
public class UpdataCenter implements Runnable{

	JPanel center;
	public UpdataCenter(JPanel center){
		this.center= center;
		if(UI.over==0){
				UI.btnStart.setText("重来");
				UI.btnStart.setEnabled(true);
			}
	}
	@Override
	public void run() {
		while(true){
			center.repaint();
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 

 

源码参考:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值