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

可视化排序实践之冒泡排序

阅读更多
如果排序过程和程序执行能结合起来,那么这个过程会更加直观。

本文简单地实现了冒泡排序的可视化。界面很简单就包括两个部分:界面左侧是可视化排序部分,右侧是冒泡排序的代码。如下图所示:



程序的关键点主要有两点:
1. 如何在页面上表示出排序程序的运行过程。
2. 如何将排序程序的运行过程和可视化排序结合起来,保持状态一致。

我的解决方法如下:
我采用了JList去模拟程序的执行,JList有一个setSelectedIndex的方法,能高亮显示指定的行。通过改变selectedIndex的值,能够达到模拟程序执行的效果。在这个过程中,记录下两个循环的索引状态值,根据这些状态值去调整可视化排序。

具体的程序页面和程序如下:
初始页面:



设定程序运行速度并点击Start开始



程序运行的中间过程:



结束界面:



package my.visualization.sort.bubble;

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 BubbleSortVisualizationFrame 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 BubbleSortPanel panel;

	public BubbleSortVisualizationFrame(){
		
		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 BubbleSortPanel(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.bubble;
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 BubbleSortPanel extends JPanel{

	private static final long serialVersionUID = -9149581857139587792L;
	
    private static final String[] code = {
    		"public void bubbleSort(int[] data) {       ",    
            "  for (int i = 0; i < data.length - 1; i++) {",    
            "    for (int j = 0; j < data.length - i - 1; j++) {",   
            "      if (data[j] > data[j + 1]) {          ",    
            "        int temp = data[j + 1];         ",    
            "        data[j + 1] = data[j];           ",    
            "        data[j] = temp;             ",    
            "	   }                              ",    
            "       }                                ", 
            "     }                                  ",
            "   }                                    "
        };    
    
	/**
	 * 初始化10个数据
	 */
	private List<NumberRectangle> numbers = initialNumberRectangles();
    
	private JList codeList = new JList(code);;
	
	public TimerAction timerAction;
	
	public Timer timer;
	
	public BubbleSortVisualizationFrame frame;
	
	public BubbleSortPanel(BubbleSortVisualizationFrame 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 = 1;
	
	
	private class TimerAction implements ActionListener, Serializable {

		private static final long serialVersionUID = -8671813189049345697L;

		public void actionPerformed(ActionEvent event) {
			if (completed) {
				return;
			}
			
			switch(selectedIndex){
			case 1:
				if(outerLoop<10){
					innerLoop = 0;
					codeList.setSelectedIndex(selectedIndex++);
				}else{
					selectedIndex = 10;
				}
			break;
			case 2:
				if(innerLoop < 10 - outerLoop -1){
					numbers.get(innerLoop).setColor(Color.RED);
					numbers.get(innerLoop+1).setColor(Color.BLUE);
					codeList.setSelectedIndex(selectedIndex++);
				}else{
					outerLoop++;
					selectedIndex =1;
				}
			break;
			case 3:
				if(numbers.get(innerLoop).getValue()>numbers.get(innerLoop+1).getValue()){
					codeList.setSelectedIndex(selectedIndex++);
				}else{
					numbers.get(innerLoop+1).setColor(Color.GREEN);
					numbers.get(innerLoop).setColor(Color.GREEN);
					innerLoop++;
					selectedIndex = 2;
				}
			break;
			case 4:
				codeList.setSelectedIndex(selectedIndex++);
				break;
			case 5:
				codeList.setSelectedIndex(selectedIndex++);
				break;
				
			case 6:
				codeList.setSelectedIndex(selectedIndex);
				int tempValue1 = numbers.get(innerLoop).getValue();
				int tempValue2 = numbers.get(innerLoop+1).getValue();
				numbers.get(innerLoop+1).setValue(tempValue1);
				numbers.get(innerLoop).setValue(tempValue2);
				numbers.get(innerLoop+1).setColor(Color.GREEN);
				numbers.get(innerLoop).setColor(Color.GREEN);
				selectedIndex = 2;
				innerLoop++;
				break;
				
			case 10:
				if(selectedIndex ==10){
					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.bubble;

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.bubble;

import javax.swing.JFrame;

public class SortApplication {
	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		BubbleSortVisualizationFrame frame = new BubbleSortVisualizationFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.show();
	}
}


程序代码也没有优化过,注释也基本上没有加,不好意思。大家如果有其它好的想法,请共享一下哦。
  • 大小: 45.5 KB
  • 大小: 37.8 KB
  • 大小: 38.2 KB
  • 大小: 38 KB
  • 大小: 43.5 KB
0
0
分享到:
评论

相关推荐

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

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

    算法可视化系列——排序算法——冒泡排序

    - **冒泡排序**:最简单的排序算法之一,时间复杂度为O(n^2)。 2. **冒泡排序步骤**: - 遍历数组,比较相邻元素的值。 - 如果前一个元素大于后一个元素,则交换它们的位置。 - 这个过程会持续n-1轮(对于n个...

    可视化排序程序

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

    JAVA可视化排序

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

    可视化排序之 - 冒泡排序-易语言

    可视化排序之 - 冒泡排序

    java GUI 实现冒泡排序

    冒泡排序是一种基础的排序算法,它通过重复遍历待排序的序列,比较相邻元素并交换位置,使得每个元素都能“浮”到它应该在的位置上。在这个Java GUI实现的冒泡排序项目中,我们利用了NetBeans工具来设计用户界面,使...

    可视化排序算法程序

    **可视化排序算法程序详解** 排序算法是计算机科学中不可或缺的一部分,它主要用于整理和优化数据结构。这个"可视化排序算法程序"提供了一种直观的方式,帮助我们理解和欣赏各种排序算法的运行过程。通过声音和视觉...

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

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

    delphi 可视化排序

    在这个“delphi 可视化排序”的例子中,我们将探讨如何在 Delphi 中实现数据的可视化排序,包括经典的冒泡排序、选择排序和快速排序算法。 首先,我们要理解什么是可视化排序。可视化排序是指通过图形界面动态展示...

    各种排序算法可视化

    1. **冒泡排序**:是最简单的排序算法之一,通过反复遍历待排序的序列,依次比较相邻元素并交换位置,直到序列完成排序。可视化可以帮助我们看到元素如何逐步“冒泡”到正确位置。 2. **选择排序**:每次从未排序的...

    数据结构课设排序算法的可视化演示(QT+C++)

    在这个课设中,我们关注的是排序算法的可视化实现,这是理解和学习算法的一种重要方式。通过使用QT+C++,我们可以创建交互式界面来直观地展示各种排序算法的工作原理。 首先,让我们了解一下排序算法。排序是将一组...

    可视化排序过程

    1. 该程序为一个可以展示不同排序算法的排序过程动画,... 一共有三种排序方法——直接插入排序、直接选择排序和冒泡排序快速排序,; 3. 排序元素输入为手动输入; 4. 有进度条显示排序的进度; 5. IDE:Eclipse

    冒泡排序可视化.py

    自己写的可视化算法,如果有错误。可以私信我哦! t = turtle.Turtle() w = turtle.Screen() turtle.hideturtle() turtle.getscreen().tracer(5,0) turtle.penup() turtle.backward(150) turtle.pendown() turtle....

    3种排序算法可视化程序 c++ 算法

    在这个C++实现的项目中,我们有三种经典的排序算法被可视化:冒泡排序、插入排序和选择排序。这些算法的可视化能够帮助我们更好地理解它们的工作原理。** ### 冒泡排序 冒泡排序是最基础的排序算法之一,它通过重复...

    C#简单的排序算法可视化程序

    在本文中,我们将深入探讨C#编程语言中的几种基本排序算法——冒泡排序、插入排序以及快速排序,并结合“C#简单的排序算法可视化程序”这一主题,了解如何将这些算法进行可视化展示。在这个Windows Forms应用程序中...

    冒泡排序(MFC可视化版).zip

    在这个"冒泡排序(MFC可视化版).zip"文件中,开发者利用Microsoft Foundation Classes (MFC)库创建了一个可视化的冒泡排序程序,使得用户能够清晰地观察到排序过程中每一步的数据交换。 MFC是微软为Windows应用程序...

    sorting-visualiser:使用Tkinter Python GUI可视化表示排序算法,例如冒泡排序,快速排序,合并排序,选择排序,插入排序,计数排序和基数排序

    我们知道排序算法,例如冒泡排序,选择排序,插入排序,快速排序。 但是通常我们无法理解特定算法的核心思想,也许是因为我们无法直观地了解它们的工作原理。 因此,要了解这些算法,最重要的是可视化。 这就是为...

    排序可视化

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

    vue实现冒泡排序可视化特效.zip

    这个"vue实现冒泡排序可视化特效"项目利用Vue.js的功能来创建一个交互式的、可视化的冒泡排序过程。冒泡排序是一种基础的排序算法,它的主要思想是通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误...

    Qt多线程可视化多线程排序算法演示:冒泡和快排

    资源描述:基于Qt的可视化界面,编写的冒泡排序和可视化排序的比较算法,通过生成10000个随机数,多线程进行排序比较,可直观看到时间复杂度对程序运行的影响程度。 可以学到的知识:Qt多线程,多进程,冒泡排序算法...

Global site tag (gtag.js) - Google Analytics