`
MouseLearnJava
  • 浏览: 467289 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

可视化排序实践之选择排序

阅读更多
本博文的程序实现对选择排序的可视化。具体的页面布局和之前的文章“可视化排序实践之冒泡排序”一致 (界面很简单就包括两个部分:界面左侧是可视化排序部分,右侧是冒泡排序的代码), 可视化排序实践之冒泡排序的博文请参考http://mouselearnjava.iteye.com/blog/1860956

程序的关键点主要有两点:
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();
	}
}


程序代码也没有优化过,注释也基本上没有加,不好意思。大家如果有其它好的想法来实现排序的可视化,请共享一下哦。

  • 大小: 40.6 KB
  • 大小: 40.5 KB
  • 大小: 40.7 KB
0
0
分享到:
评论

相关推荐

    可视化排序程序

    通过学习和实践可视化排序程序,不仅可以提升编程技能,还能深入理解排序算法的原理,对于计算机科学的学习和教学都大有裨益。同时,这样的项目也锻炼了软件工程的全生命周期管理,包括需求分析、设计、编码、测试和...

    JAVA可视化排序

    在编程领域,排序是数据处理的基本操作之一,而可视化排序则能让用户直观地理解排序算法的工作原理。在Java中,我们可以使用Swing或JavaFX等图形用户界面(GUI)库来实现可视化排序。本篇文章将深入探讨如何在Java中...

    各种排序算法可视化

    **排序算法可视化** 排序算法是计算机科学中的基本概念,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本项目提供了十种不同的排序算法的可视化展示,通过C++语言实现,这有助于...

    排序可视化

    总之,排序可视化项目是学习和教学排序算法的优秀工具,它将理论与实践相结合,使编程学习更加直观有趣。对于C#开发者来说,掌握这些基础知识和技巧,不仅能够提升编程技能,还有助于培养问题解决和逻辑思维的能力。

    冒泡排序可视化、冒泡排序动画版

    总的来说,“冒泡排序可视化”和“冒泡排序动画版”是教育和技术结合的优秀示例,它们利用现代前端技术将抽象的算法实体化,提升了学习效率和兴趣,对于初学者和教学者来说都是一份宝贵的资源。而“vuejs-bubble-...

    各种排序算法的可视化比较_C++_

    可视化排序算法可以帮助我们直观地看到每一步的变化,增强理解和记忆。通过绘制每个元素的位置和交换过程,可以清楚地看到如何逐步达到排序目标。例如,可以使用二维图形或者动画来表示冒泡排序过程中元素的移动。 ...

    三十种排序算法的可视化

    总的来说,这个“三十种排序算法的可视化”项目是一个极好的学习资源,它将理论知识与实践结合,使得学习者能够生动、直观地掌握排序算法的核心概念和运作机制,对于提升编程技能和理解复杂算法有着极大的帮助。

    算法可视化系列——排序算法——插入排序

    在编程实践中,我们可以利用各种工具(如IDE的调试功能)来可视化插入排序的过程,帮助理解其运作机制。例如,使用Python的`matplotlib`库绘制动态图,或使用专门的算法可视化平台(如给出的博客链接所示)来直观...

    Android-Android图形化展示排序算法

    在Android应用中实现图形化排序算法,首先需要了解各种基本的排序算法,例如冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序等。这些算法各有特点,如冒泡排序的时间复杂度为O(n^2),适用于小规模数据...

    Day 4 - 可视化最佳实践.pdf

    3. **辅助决策**:可视化工具使得数据分析结果更加易于理解,帮助决策者做出更加明智的选择。 4. **促进沟通**:好的可视化不仅能够向非专业人士传达复杂的信息,还能在团队内部促进更好的交流与协作。 #### 三、...

    可视化对比十多种排序算法(C#版)源码

    这个"可视化对比十多种排序算法(C#版)源码"项目为开发者提供了一个极好的学习和比较不同排序算法的平台。C#是一种常用的编程语言,尤其在Windows应用程序和游戏开发中广泛应用,因此这个源码对C#开发者来说具有很...

    使用 RGB 颜色可视化排序算法的Python应用程序_python_代码_下载

    这个"使用 RGB 颜色可视化排序算法的Python应用程序"提供了一个很好的实践示例,帮助我们理解和应用这一概念。 首先,我们要理解RGB颜色模型。RGB代表红(Red)、绿(Green)和蓝(Blue),是加性色彩模式的基础,...

    算法可视化系列——排序算法——快速排序

    在这个系列中,我们将通过算法可视化来深入理解快速排序的工作原理。 快速排序的步骤如下: 1. **选择基准元素(Pivot Selection)**:首先,我们需要从数组中选取一个元素作为基准。这个元素将用来划分数组,使得...

    二叉排序树项目可视化图形界面

    本项目是针对数据结构课程设计的一次实践,通过C++语言实现了一个可视化的二叉排序树图形界面。这个项目不仅涵盖了二叉排序树的基本概念,还涉及到了图形用户界面(GUI)的开发,使得用户能够直观地观察和操作二叉...

    可视化算法

    可视化算法是一种将复杂的数据或计算过程...通过实践这样的案例,不仅可以深入理解Raptor的可视化编程方法,还能提高对算法设计和软件工程的理解。同时,结合图片和声音的使用,也能锻炼到多媒体处理和综合应用的能力。

    r语言制作可视化快速排序动图gif图

    通过这样的可视化,我们可以直观地看到快速排序如何通过选择枢轴值,将大数组分解成更小的部分,然后递归地对这些部分进行排序,最终得到完全排序的结果。 总结一下,本教程介绍了如何使用R语言的ggplot2和...

    c#实现各个排序可视化.rar

    本项目"**c#实现各个排序可视化**"显然是一个教学资源,旨在帮助学生理解并实践计算机科学中的核心概念——排序算法。通过可视化的方式,学习者可以更直观地看到排序过程,加深对各种算法的理解。 排序是计算机科学...

    算法的可视化

    在计算机科学中,排序是最基础且广泛使用的算法之一,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等多种方法。这些排序算法各有特点,理解它们的运作机制对学习和优化代码至关重要。 1. **冒泡排序**:...

    可视化展示希尔排序算法实现效果

    在可视化展示希尔排序的过程中,Qt是一个非常实用的工具。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它可以用于创建美观且功能丰富的界面。在这个实例中,Qt被用来创建一个交互式的界面,动态显示希尔排序...

    可视化展示冒泡算法实现效果

    总的来说,这个项目是一个很好的学习实践,它将理论知识与实际应用结合起来,帮助初学者更好地理解冒泡排序这一基础算法,并通过Qt的可视化能力提升编程技能。通过研究和扩展这个项目,你不仅可以掌握冒泡排序,还能...

Global site tag (gtag.js) - Google Analytics