设计思路:(用多线程并且每次交换数据都暂停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();
}
}
}
}
源码参考: