在网上看到一个视频将各种排序用视频表示出来,配上音乐,挺好玩的样子,就算是不会编程的人看到也会觉得很舒服,碰巧我也正在写归并算法,于是就用java的GUI实现一个。

  归并排序的时间复杂度是T(n)=O(nlgn),据说是比较排序的时间复杂度下限,缺点是排序算法和合并算法并不在同一空间,使得空间复杂度会有所提升。插入排序避免了归并排序的这一缺点但是又有一新缺点:空间复杂度为O(n2)..插入排序通过二分法改进就不同了,他是前二者的合体,既不在原地排序时间复杂度还是O(n2)……哈哈,开个玩笑。真正的合二者之优点为一的是堆排序,不过目前还没看懂堆排序~看懂了再来记一个。

  话不多说代码如下:

 package com.wyb.dyi.test;

 import java.awt.Color;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.util.Random; import javax.swing.JFrame;
import javax.swing.JPanel; public class ShowMergeSort {
static int[] array = getArray(Tool.W);/* 获得长度为屏幕宽度的乱序数组 */
static updateShowArrayImg m = new updateShowArrayImg(array);/* 先显示当前乱序数组 */ /**
* 归并排序,并将排序过程打印成图像
* @param args
*/
public static void main(String[] args) {
MyJPanel show = m.show;
/* 开局暂停两秒 */
try {
Thread.currentThread();
Thread.sleep(2000);
} catch (Exception e) {
} /* 开始归并排序 */
m.updateShowArray(array);
devide(array, 0, array.length - 1);
m.updateShowArray(array);
} /* 构造一个长度为length的高度为length/2的数组 */
public static int[] getArray(int length) {
/* 生成空数组 */
int[] re = new int[length];
/* 给数组附上高为length/2的升序数值 */
for (int i = 0; i < re.length; i++)
re[i] = i / 2;
/* 讲有序数组打乱 */
for (int i = 0; i < 20 * re.length; i++) {
int index1 = new Random().nextInt(length);
int index2 = new Random().nextInt(length);
int temp = re[index1];
re[index1] = re[index2];
re[index2] = temp;
} return re;
} /* 分解数据 */
public static void devide(int[] array, int left, int right) { if (left < right) {
/* 寻找到中间下标 */
int mid = (right + left) / 2;
/* 从中间下标隔断,将前后两段分别分解 */
devide(array, left, mid);
/* 继续分割第二段 */
devide(array, mid + 1, right);
/* 分割完了,调用归并 */
merge(array, left, mid, mid + 1, right);
}
} /* 归并,包含排序 */
public static void merge(int[] array, int leftStart, int leftEnd,
int rightStart, int rightEnd) {
/* 新建临时数组,存放该次归并后的数据 */
int[] temp = new int[array.length];
/* 记录归并的左组和右组开始结束下标 */
int ls = leftStart, le = leftEnd, rs = rightStart, re = rightEnd;
/* 记录临时数组的存放位置 */
int index = ls;
/* 第一次比较归并,左组合右组中较小的入temp */
while (ls <= le && rs <= re) {
if (array[ls] <= array[rs]) {
temp[index] = array[ls];
index++;
ls++;
} else {
temp[index] = array[rs];
index++;
rs++;
}
}
/* 第二次选择归并,将array中剩余的未加入temp的数加入到temp中 */
while (ls <= le) {
temp[index] = array[ls];
ls++;
index++;
}
while (rs <= re) {
temp[index] = array[rs];
rs++;
index++;
}
/* temp是经过调整后的array,此时一次归并完毕,返回数据进行下一次归并 */
while (leftStart <= rightEnd) {
array[leftStart] = temp[leftStart];
leftStart += 1;
}
/* 打印本次归并结果,输出成图像 */
m.updateShowArray(array);
} /* 打印数组 */
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++)
System.out.print(array[i] + " ");
System.out.println();
} } /* 工具类,获取当前屏幕大小,用户初始化显示组件和new乱序数组 */
class Tool {
public static int W = (int) Toolkit.getDefaultToolkit().getScreenSize()
.getWidth();/* 当前屏幕宽度 */
public static int H = (int) Toolkit.getDefaultToolkit().getScreenSize()
.getHeight();/* 当前屏幕高度 */
} /* 画图面板 */
class MyJPanel extends JPanel {
private static final long serialVersionUID = 1L;
int[] array;/* 用于接收构造方法传过来的数组,用于绘图 */ public MyJPanel(int[] a) {
array = a;
} /* 绘图函数 */
public void paintComponent(Graphics g) {
/* 画笔置白色 */
g.setColor(Color.WHITE);
/* 擦除上一次绘制的团 */
g.fillRect(0, 0, Tool.W, Tool.H);
/* 画笔置黑色 */
g.setColor(Color.black);
/* 开始绘制当前数组图像,以(0,Tool.H)为原点,向右为x轴表数组下标,向上为y轴表当前下标所对应数组存置大小 */
for (int i = 0; i < array.length; i++) {
g.drawLine(i, Tool.H - 80, i, Tool.H - array[i] - 80);
} }
} /* 显示主框架JFrame类 */
class updateShowArrayImg extends JFrame {
private static final long serialVersionUID = 1L;
MyJPanel show; /* 构造函数,初始化显示框架 */
public updateShowArrayImg(int[] a) {
show = new MyJPanel(a);
show.setBounds(0, 0, Tool.W, Tool.H);
this.setSize(Tool.W, Tool.H);
this.setTitle("归并排序");
this.setLocation(0, 0);
this.add(show);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} /**
* 更新画布
*
* @param a
*/
public void updateShowArray(int[] a) {
this.remove(show);
show = new MyJPanel(a);
this.add(show);
this.setVisible(true);
}
}

ShowMergeSort.java

  效果图奉上:

  优酷视频之GUI显示归并算法过程

【子非鱼】归并排序过程呈现之java内置GUI表示的更多相关文章

  1. 【开发者笔记】归并排序过程呈现之java内置GUI表示

    在网上看到一个视频将各种排序用视频表示出来,配上音乐,挺好玩的样子,就算是不会编程的人看到也会觉得很舒服,碰巧我也正在写归并算法,于是就用java的GUI实现一个. 归并排序的时间复杂度是T(n)=O ...

  2. 【子非鱼】冒泡排序过程呈现之java内置GUI表示

    自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...

  3. 【开发者笔记】冒泡排序过程呈现之java内置GUI表示

    自己玩玩写写,排序的过程多么有趣,特别是把看着电脑吧一堆乱七八糟的数据排成有序组合的时候,看起来贼舒服,特别是强迫症患者.好了,话不多说上代码,也算是自己记录一下吧,没有什么技术含量但个人感觉比较有趣 ...

  4. 【子非鱼】插入排序过程呈现之java内置GUI表示

    先给代码,再给过程视频: package com.dyi.wyb.sort; import java.awt.Color; import java.awt.Graphics; import java. ...

  5. 【开发者笔记】插入排序过程呈现之java内置GUI表示

    先给代码,再给过程视频: package com.dyi.wyb.sort; import java.awt.Color; import java.awt.Graphics; import java. ...

  6. Java 性能分析工具 , 第 2 部分:Java 内置监控工具

    引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...

  7. 深入理解Java内置锁和显式锁

    synchronized and Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两 ...

  8. 使用Java内置的Http Server构建Web应用

    一.概述 使用Java技术构建Web应用时, 我们通常离不开tomcat和jetty之类的servlet容器,这些Web服务器功能强大,性能强劲,深受欢迎,是运行大型Web应用的必备神器. 虽然Jav ...

  9. java内置线程池ThreadPoolExecutor源码学习记录

    背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX ...

随机推荐

  1. 通过判断cookie过期方式向Memcached中添加,取出数据(Java)

    应用场景:在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够 ...

  2. GCD 多线程 ---的记录 iOS

    先写一个GCD static UserInfoVoModel *userInfoShare = nil; +(instancetype)shareUserInfoVoModel { static di ...

  3. iOS 创建OpenGL 环境的思考

    关于如何从头开始创建环境,可以参考大神的博文OpenGL ES 3.0 数据可视化 0:Hello world,本文只是补充一些我在实践中的一些思考. CAEAGLLayer If you plan ...

  4. SQL极限函数limit()详解<分页必备>

    limit含义: limit英语中的含义是限制,限定的意思.小日本曾上映过一个电影就是叫limit是由漫画改编的电影,剧情很变态,但不可否认小日本由于地狭人稠的原因,在观念上的资源危机意识还是很强的哈 ...

  5. js DOM操作---登录例子总结

    简单的总结下用 javascript DOM 实现简易登录框例子,下面是简单的模拟登录,没有具体的登录样子,但只是模拟,整理下思路. 页面简单布局,我这个确实太简单了,看代码: <body> ...

  6. jsp内置对象的方法

    JSP内置对象的方法:out:out.print();request:request对象主要用于出列客户端请求.   常用方法:    String getParameter(String name) ...

  7. Android学习20--OpenGL的"mapPoints"

    在OpenGL中有时会需要求一个3维空间中的点在平移(缩放,旋转)后坐标是多少.需求相当于二维的mapPoints.可以通过这个函数实现 void multiplyMV (float[] result ...

  8. java学习笔记——IO部分(遍历文件夹)

    用File类写的一个简单的工具,遍历文件夹,获取该文件夹下的所以文件(含子目录下的文件)和文件大小: /** * 列出指定目录下(包含其子目录)的所有文件 * @author syskey * */ ...

  9. Tomcat8 + Redis实现session集中管理

      环境准备:   部署两台 tomcat 8.0   安装 redis 服务器   下载工具库( commons-pool2-2.3.jar.jedis-2.7.2.jar .改良版的 tomcat ...

  10. Josephus问题的java实现

    import java.util.ArrayList; import java.util.ListIterator; public class Josephus { public static voi ...