- 浏览: 467289 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
本博文的程序实现对选择排序的可视化。具体的页面布局和之前的文章“可视化排序实践之冒泡排序”一致 (界面很简单就包括两个部分:界面左侧是可视化排序部分,右侧是冒泡排序的代码), 可视化排序实践之冒泡排序的博文请参考http://mouselearnjava.iteye.com/blog/1860956
程序的关键点主要有两点:
1. 如何在页面上表示出排序程序的运行过程。
2. 如何将排序程序的运行过程和可视化排序结合起来,保持状态一致。
我的解决方法如下:
我采用了JList去模拟程序的执行,JList有一个setSelectedIndex的方法,能高亮显示指定的行。通过改变selectedIndex的值,能够达到模拟程序执行的效果。在这个过程中,记录下两个循环的索引状态值,根据这些状态值去调整可视化排序。
具体的程序页面和程序如下:
初始页面:
点击“Set”Menu,设定好程序运行的速度并点击“Start”Menu Item开始执行程序。
程序运行的中间过程:
排序完成之后的界面:
具体的程序代码如下:
程序代码也没有优化过,注释也基本上没有加,不好意思。大家如果有其它好的想法来实现排序的可视化,请共享一下哦。
程序的关键点主要有两点:
1. 如何在页面上表示出排序程序的运行过程。
2. 如何将排序程序的运行过程和可视化排序结合起来,保持状态一致。
我的解决方法如下:
我采用了JList去模拟程序的执行,JList有一个setSelectedIndex的方法,能高亮显示指定的行。通过改变selectedIndex的值,能够达到模拟程序执行的效果。在这个过程中,记录下两个循环的索引状态值,根据这些状态值去调整可视化排序。
具体的程序页面和程序如下:
初始页面:
点击“Set”Menu,设定好程序运行的速度并点击“Start”Menu Item开始执行程序。
程序运行的中间过程:
排序完成之后的界面:
具体的程序代码如下:
package my.visualization.sort.select; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; /** * * @author Eric * @version 1.0 * */ public class SelectSortVisualizationFrame extends JFrame { private static final long serialVersionUID = -6725108659717827278L; private Container contentPane; /** * 设置三个Menu Item,分别用于开始程序,调整运行的速度以及退出程序 * */ private JMenuItem startMI = new JMenuItem("Start"); private JMenu speedMenu = new JMenu("Speed"); private JMenuItem exitMI = new JMenuItem("Exit"); /** * 设定5个速度级别 */ private JRadioButtonMenuItem speedMI1 = new JRadioButtonMenuItem("Speed1", true); private JRadioButtonMenuItem speedMI2 = new JRadioButtonMenuItem("Speed2", false); private JRadioButtonMenuItem speedMI3 = new JRadioButtonMenuItem("Speed3", false); private JRadioButtonMenuItem speedMI4 = new JRadioButtonMenuItem("Speed4", false); private JRadioButtonMenuItem speedMI5 = new JRadioButtonMenuItem("Speed5", false); public int speedFlag = 1; /** * 冒泡排序可视化的Panel */ private SelectSortPanel panel; public SelectSortVisualizationFrame(){ setTitle("可视化排序之选择排序"); setSize(700, 400); setResizable(false); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu setMenu = new JMenu("Set"); setMenu.setMnemonic('s'); menuBar.add(setMenu); setMenu.add(startMI); setMenu.addSeparator(); setMenu.addSeparator(); setMenu.add(speedMenu); setMenu.addSeparator(); setMenu.add(exitMI); ButtonGroup group = new ButtonGroup(); group.add(speedMI1); group.add(speedMI2); group.add(speedMI3); group.add(speedMI4); group.add(speedMI5); speedMenu.add(speedMI1); speedMenu.add(speedMI2); speedMenu.add(speedMI3); speedMenu.add(speedMI4); speedMenu.add(speedMI5); startMI.addActionListener(new StartAction()); speedMI1.addActionListener(new SpeedAction()); speedMI2.addActionListener(new SpeedAction()); speedMI3.addActionListener(new SpeedAction()); speedMI4.addActionListener(new SpeedAction()); speedMI5.addActionListener(new SpeedAction()); exitMI.addActionListener(new ExitAction()); contentPane = getContentPane(); panel = new SelectSortPanel(this); contentPane.add(panel); startMI.setEnabled(true); } private class StartAction implements ActionListener { public void actionPerformed(ActionEvent event) { startMI.setEnabled(false); panel.timer.start(); } } private class ExitAction implements ActionListener { public void actionPerformed(ActionEvent event) { System.exit(0); } } private class SpeedAction implements ActionListener { public void actionPerformed(ActionEvent event) { Object speed = event.getSource(); if (speed == speedMI1) { speedFlag = 1; } else if (speed == speedMI2) { speedFlag = 2; } else if (speed == speedMI3) { speedFlag = 3; } else if (speed == speedMI4) { speedFlag = 4; } else if (speed == speedMI5) { speedFlag = 5; } panel.timer.setDelay(1000 - 200 * (speedFlag - 1)); } } }
package my.visualization.sort.select; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.Timer; public class SelectSortPanel extends JPanel { private static final long serialVersionUID = -9149581857139587792L; private static final String[] code = { "public void selectSort(int[] data) {", " int temp;", " int minIndex = 0;", " for (int i = 0; i < data.length - 1; i++) {", " minIndex = i;", " for (int j = i + 1; j < data.length; j++) {", " if (data[minIndex] > data[j]) {", " minIndex = j;", " } ", " }", " temp = data[i]; ", " data[i] = data[minIndex];", " data[minIndex] = temp;", " }", "}" }; /** * 初始化10个数据 */ private List<NumberRectangle> numbers = initialNumberRectangles(); private JList codeList = new JList(code);; public TimerAction timerAction; public Timer timer; public SelectSortVisualizationFrame frame; public SelectSortPanel(SelectSortVisualizationFrame frame) { timerAction = new TimerAction(); timer = new Timer(1000, timerAction); codeList.setSelectedIndex(1); JScrollPane scrollPane1 = new JScrollPane(codeList); this.setLayout(new BorderLayout()); this.add(scrollPane1, BorderLayout.EAST); this.frame = frame; } /** * 判断排序是否已经结束 */ private boolean completed = false; public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; drawNumberRectangles(g2); } private void drawNumberRectangles(Graphics2D g2) { for (NumberRectangle rectangle : numbers) { rectangle.draw(g2); } } int outerLoop = 0; int innerLoop = 0; int selectedIndex = 3; int minIndex = 0; private class TimerAction implements ActionListener, Serializable { private static final long serialVersionUID = -8671813189049345697L; public void actionPerformed(ActionEvent event) { if (completed) { return; } switch (selectedIndex) { case 3: if (outerLoop < 9) { codeList.setSelectedIndex(selectedIndex++); numbers.get(outerLoop).setColor(Color.RED); innerLoop = outerLoop + 1; minIndex = outerLoop; } else { selectedIndex = 14; } break; case 4: codeList.setSelectedIndex(selectedIndex++); break; case 5: if (innerLoop < 10) { codeList.setSelectedIndex(selectedIndex++); numbers.get(innerLoop).setColor(Color.BLUE); } else { selectedIndex = 10; } break; case 6: numbers.get(innerLoop).setColor(Color.GREEN); if (numbers.get(minIndex).getValue() > numbers.get(innerLoop) .getValue()) { codeList.setSelectedIndex(selectedIndex++); } else { codeList.setSelectedIndex(selectedIndex++); innerLoop++; selectedIndex = 5; } break; case 7: minIndex = innerLoop; innerLoop++; selectedIndex = 5; break; case 10: codeList.setSelectedIndex(selectedIndex++); break; case 11: codeList.setSelectedIndex(selectedIndex++); break; case 12: numbers.get(innerLoop-1).setColor(Color.GREEN); codeList.setSelectedIndex(selectedIndex); int tempValue1 = numbers.get(outerLoop).getValue(); int tempValue2 = numbers.get(minIndex).getValue(); numbers.get(outerLoop).setValue(tempValue2); numbers.get(minIndex).setValue(tempValue1); numbers.get(minIndex).setColor(Color.GREEN); numbers.get(outerLoop).setColor(Color.GREEN); selectedIndex = 3; //innerLoop++; outerLoop++; break; case 14: completed = true; codeList.setSelectedIndex(selectedIndex); break; default: break; } repaint(); } } private List<NumberRectangle> initialNumberRectangles() { List<NumberRectangle> list = new ArrayList<NumberRectangle>(); /** * 随机产生10个数组 */ Random random = new Random(); for (int i = 1; i <= 10; i++) { list.add(new NumberRectangle(i, 1, random.nextInt(15) + 1, Color.GREEN)); } return list; } }
package my.visualization.sort.select; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; public class NumberRectangle { private int x; private int y; private int value; private Color color; public NumberRectangle() { } public NumberRectangle(int x, int y, int value, Color color) { this.x = x; this.y = y; this.color = color; this.value = value; } public void draw(Graphics2D g2) { int clientX = 30 + x * 30; int clientY = 20 + y * 10; Rectangle2D.Double rect = new Rectangle2D.Double(clientX, clientY, 20, value * 20); g2.setPaint(color); g2.fill(rect); g2.setPaint(Color.BLACK); g2.draw(rect); g2.drawString(String.valueOf(value), clientX, clientY - 10); } /** * @return the color */ public Color getColor() { return color; } /** * @param color * the color to set */ public void setColor(Color color) { this.color = color; } /** * @return the x */ public int getX() { return x; } /** * @param x * the x to set */ public void setX(int x) { this.x = x; } /** * @return the y */ public int getY() { return y; } /** * @param y * the y to set */ public void setY(int y) { this.y = y; } /** * @return the value */ public int getValue() { return value; } /** * @param value * the value to set */ public void setValue(int value) { this.value = value; } }
package my.visualization.sort.select; import javax.swing.JFrame; public class SortApplication { @SuppressWarnings("deprecation") public static void main(String[] args) { SelectSortVisualizationFrame frame = new SelectSortVisualizationFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.show(); } }
程序代码也没有优化过,注释也基本上没有加,不好意思。大家如果有其它好的想法来实现排序的可视化,请共享一下哦。
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 910面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6735本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2223本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1745尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2733本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2175正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3758本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1961问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3984题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3185题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8758EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3334题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6706面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9851Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1423个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2148从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7401for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4159本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2907本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
通过学习和实践可视化排序程序,不仅可以提升编程技能,还能深入理解排序算法的原理,对于计算机科学的学习和教学都大有裨益。同时,这样的项目也锻炼了软件工程的全生命周期管理,包括需求分析、设计、编码、测试和...
在编程领域,排序是数据处理的基本操作之一,而可视化排序则能让用户直观地理解排序算法的工作原理。在Java中,我们可以使用Swing或JavaFX等图形用户界面(GUI)库来实现可视化排序。本篇文章将深入探讨如何在Java中...
**排序算法可视化** 排序算法是计算机科学中的基本概念,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本项目提供了十种不同的排序算法的可视化展示,通过C++语言实现,这有助于...
总之,排序可视化项目是学习和教学排序算法的优秀工具,它将理论与实践相结合,使编程学习更加直观有趣。对于C#开发者来说,掌握这些基础知识和技巧,不仅能够提升编程技能,还有助于培养问题解决和逻辑思维的能力。
总的来说,“冒泡排序可视化”和“冒泡排序动画版”是教育和技术结合的优秀示例,它们利用现代前端技术将抽象的算法实体化,提升了学习效率和兴趣,对于初学者和教学者来说都是一份宝贵的资源。而“vuejs-bubble-...
可视化排序算法可以帮助我们直观地看到每一步的变化,增强理解和记忆。通过绘制每个元素的位置和交换过程,可以清楚地看到如何逐步达到排序目标。例如,可以使用二维图形或者动画来表示冒泡排序过程中元素的移动。 ...
总的来说,这个“三十种排序算法的可视化”项目是一个极好的学习资源,它将理论知识与实践结合,使得学习者能够生动、直观地掌握排序算法的核心概念和运作机制,对于提升编程技能和理解复杂算法有着极大的帮助。
在编程实践中,我们可以利用各种工具(如IDE的调试功能)来可视化插入排序的过程,帮助理解其运作机制。例如,使用Python的`matplotlib`库绘制动态图,或使用专门的算法可视化平台(如给出的博客链接所示)来直观...
在Android应用中实现图形化排序算法,首先需要了解各种基本的排序算法,例如冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序等。这些算法各有特点,如冒泡排序的时间复杂度为O(n^2),适用于小规模数据...
3. **辅助决策**:可视化工具使得数据分析结果更加易于理解,帮助决策者做出更加明智的选择。 4. **促进沟通**:好的可视化不仅能够向非专业人士传达复杂的信息,还能在团队内部促进更好的交流与协作。 #### 三、...
这个"可视化对比十多种排序算法(C#版)源码"项目为开发者提供了一个极好的学习和比较不同排序算法的平台。C#是一种常用的编程语言,尤其在Windows应用程序和游戏开发中广泛应用,因此这个源码对C#开发者来说具有很...
这个"使用 RGB 颜色可视化排序算法的Python应用程序"提供了一个很好的实践示例,帮助我们理解和应用这一概念。 首先,我们要理解RGB颜色模型。RGB代表红(Red)、绿(Green)和蓝(Blue),是加性色彩模式的基础,...
在这个系列中,我们将通过算法可视化来深入理解快速排序的工作原理。 快速排序的步骤如下: 1. **选择基准元素(Pivot Selection)**:首先,我们需要从数组中选取一个元素作为基准。这个元素将用来划分数组,使得...
本项目是针对数据结构课程设计的一次实践,通过C++语言实现了一个可视化的二叉排序树图形界面。这个项目不仅涵盖了二叉排序树的基本概念,还涉及到了图形用户界面(GUI)的开发,使得用户能够直观地观察和操作二叉...
可视化算法是一种将复杂的数据或计算过程...通过实践这样的案例,不仅可以深入理解Raptor的可视化编程方法,还能提高对算法设计和软件工程的理解。同时,结合图片和声音的使用,也能锻炼到多媒体处理和综合应用的能力。
通过这样的可视化,我们可以直观地看到快速排序如何通过选择枢轴值,将大数组分解成更小的部分,然后递归地对这些部分进行排序,最终得到完全排序的结果。 总结一下,本教程介绍了如何使用R语言的ggplot2和...
本项目"**c#实现各个排序可视化**"显然是一个教学资源,旨在帮助学生理解并实践计算机科学中的核心概念——排序算法。通过可视化的方式,学习者可以更直观地看到排序过程,加深对各种算法的理解。 排序是计算机科学...
在计算机科学中,排序是最基础且广泛使用的算法之一,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等多种方法。这些排序算法各有特点,理解它们的运作机制对学习和优化代码至关重要。 1. **冒泡排序**:...
在可视化展示希尔排序的过程中,Qt是一个非常实用的工具。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它可以用于创建美观且功能丰富的界面。在这个实例中,Qt被用来创建一个交互式的界面,动态显示希尔排序...
总的来说,这个项目是一个很好的学习实践,它将理论知识与实际应用结合起来,帮助初学者更好地理解冒泡排序这一基础算法,并通过Qt的可视化能力提升编程技能。通过研究和扩展这个项目,你不仅可以掌握冒泡排序,还能...