`

图形化显示---冒泡排序

    博客分类:
  • java
 
阅读更多
代码:
package com.thread.singal;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.util.concurrent.Semaphore;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 
 * @author yangjianzhou
 * @description TODO
 * @time Dec 5, 2014 : 8:17:30 PM
 */
public class AlgorithmAnimation {

	public static void main(String[] args) {

		EventQueue.invokeLater(new Runnable() {

			@Override
			public void run() {
				JFrame frame = new AnimationFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}

		});
	}
}

class AnimationFrame extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 300;

	/**
	 * set layout
	 */
	public AnimationFrame() {
		ArrayComponent comp = new ArrayComponent();
		add(comp, BorderLayout.CENTER);
		final Sorter sorter = new Sorter(comp);

		JButton runButton = new JButton("Run");
		runButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent event) {
				sorter.setRun();
			}
		});

		JButton stepButton = new JButton("Step");
		stepButton.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent event) {
				sorter.setStep();
			}
		});

		JPanel buttons = new JPanel();
		buttons.add(runButton);
		buttons.add(stepButton);
		add(buttons, BorderLayout.NORTH);
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		this.setTitle("Bubble Sort");
		
		Thread t = new Thread(sorter);
		t.start();
	}

}

class Sorter implements Runnable {

	private Double[] values;
	private ArrayComponent component;
	private Semaphore gate;
	private static final int DELAY = 100;
	private volatile boolean run;
	private static final int VALUES_LENGTH = 30;

	/* init data */
	public Sorter(ArrayComponent comp) {
		values = new Double[VALUES_LENGTH];
		for (int i = 0; i < values.length; i++) {
			values[i] = new Double(Math.random());
		}
		this.component = comp;
		this.gate = new Semaphore(1);
		this.run = false;
	}

	/**
	 * sort in one time
	 */
	public void setRun() {
		run = true;
		gate.release();
	}

	/**
	 * sort step by step
	 */
	public void setStep() {
		run = false;
		gate.release();
	}

	public void run() {

		component.setValues(values, values[0]);
		sort(values);
		component.setValues(values, null);
	}

	/**
	 * bub sort
	 * 
	 * @param values
	 */
	public void sort(Double[] values) {
		int len = values.length;
		Double temp;
		for (int i = 0; i < len; i++) {
			for (int j = len - 1; j > i; j--) {
				if (values[j] < values[j - 1]) {
					temp = values[j - 1];
					values[j - 1] = values[j];
					values[j] = temp;
					component.setValues(values, values[j - 1]);
					try {
						if (run) {
							// show the draw process
							Thread.sleep(DELAY);
						} else {
							gate.acquire();
						}
					} catch (InterruptedException exception) {
						Thread.currentThread().interrupt();
					}
				}
			}
		}
	}

}

class ArrayComponent extends JComponent {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Double marked;

	private Double[] values;

	public synchronized void setValues(Double[] values, Double marked) {
		this.values = values;
		this.marked = marked;
		repaint();
	}

	/**
	 * paint the bars
	 */
	public synchronized void paintComponent(Graphics g) {
		if (values == null) {
			return;
		}
		Graphics2D g2 = (Graphics2D) g;
		int width = getWidth() / values.length;
		int compHeight = getHeight();
		for (int i = 0; i < values.length; i++) {
			double height = values[i] * getHeight();
			Rectangle2D bar = new Rectangle2D.Double(width * i, compHeight - height, width, height);
			if (values[i] == marked) {
				g2.fill(bar);
			} else {
				g2.draw(bar);
			}
		}
	}
}



显示效果:



  • 大小: 8 KB
分享到:
评论

相关推荐

    课程设计《冒泡排序和快速排序的交互动画》图形化显示

    《冒泡排序与快速排序的交互动画》课程设计是一个基于Java编程语言的项目,它通过图形化的方式展示了这两种基础排序算法的工作原理。这个项目利用了JavaFX库,这是一个强大的工具,可以创建丰富的用户界面和交互式...

    图形化编程实现冒泡排序(Scratch)

    少儿编程的算法比较少,这个Scratch文件结合了数据结构里的经典算法——冒泡排序,给出了实现过程。把少儿编程与算法结合到了一起

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

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

    内部排序图形化界面

    例如,通过动态显示冒泡排序过程中元素的交换,用户可以清晰地看到数据如何一步步调整到正确的位置。同样,快速排序的划分过程也可以通过界面生动展示,帮助用户理解“分区”和“递归”的概念。 此外,该项目还允许...

    Visual Basic 实验3-冒泡排序程序

    冒泡排序是一种基础的排序算法,它通过重复遍历待排序的序列,比较相邻元素并交换位置来达到排序的目的。在Visual Basic环境下实现冒泡排序,可以加深对编程逻辑和算法的理解。本实验旨在帮助国家开放大学的学生掌握...

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

    冒泡排序是一种基础且经典的排序算法,它的主要思想是通过不断地交换相邻的逆序元素,逐渐将较大的元素“冒”到数组的后端,从而实现整个序列的有序化。在这个过程中,每一遍的冒泡都会确保当前未排序部分的最大元素...

    图形界面-排序

    在IT领域,图形用户界面(GUI,Graphical User Interface)是一种通过图标、窗口和菜单等可视化元素与用户交互的方式,极大地提高了用户操作的便捷性。本项目“图形界面-排序”是一个基于Java语言实现的简单GUI程序...

    冒泡排序过程演示程序

    冒泡排序是一种基础且直观的排序算法,常用于教学目的,其主要原理是通过重复遍历待排序的序列,比较相邻元素...通过调试和分析这个程序,你可以更深入地了解冒泡排序的工作原理,以及如何利用MFC来构建图形用户界面。

    冒泡排序 的动态演示 动画 C++写

    在动态演示冒泡排序的过程中,可能需要利用某种图形库或者窗口系统,例如Windows上的`GDI`或跨平台的`SFML`、`Qt`等,来绘制数组元素并实时更新它们的位置。每一轮排序后,数组的状态会被绘制出来,用户可以看到元素...

    冒泡排序源代码下载 冒泡排序源代码下载

    另一个文件"冒泡排序-视窗版"可能是源代码文件,可能是`.cs`(C#)或`.vb`(Visual Basic)格式,其中包含了冒泡排序的具体实现。 冒泡排序的算法步骤如下: 1. **初始化**:遍历整个数组,从第一个元素开始。 2. ...

    图示详解冒泡排序

    冒泡排序是一种基础且经典的排序算法,它的基本思想是通过不断地交换相邻的逆序元素,逐步将较大的元素“冒”到序列的后端,较小的元素“沉”到前端,从而实现整个序列的有序化。在本文中,我们将深入探讨冒泡排序的...

    vue项目实现冒泡排序的可视化(bubbleSort)

    在这个“vue项目实现的冒泡排序可视化”中,开发者利用Vue.js框架,将这个算法的运行过程以图形化的方式呈现,帮助学习者更好地理解冒泡排序的工作原理。 Vue.js是JavaScript的一种轻量级前端框架,它提供了声明式...

    队列冒泡排序VI

    程序框图则是VI的逻辑实现,使用图形化编程节点来表示各种操作,包括队列操作和冒泡排序的逻辑。 在实际应用中,"队列冒泡排序VI" 可以作为模块化组件,与其他labVIEW程序集成,提供排序功能。对于需要频繁排序但不...

    5-冒泡排序-少儿编程scratch项目源代码文件案例素材.zip

    在这个少儿编程的Scratch项目中,孩子们将通过可视化的方式学习冒泡排序的原理。 在Scratch编程环境中,冒泡排序通常会用到一系列的积木块来实现。首先,我们需要一个包含待排序数字的列表。列表中的每个数字都会被...

    冒泡排序MFC实现

    例如,对于“排序”按钮,你需要创建一个按钮控件,并为其关联一个ON_BN_CLICKED消息处理函数,在这个函数中调用冒泡排序算法并显示结果。 5. **MFC应用结构**:在MFC程序中,应用程序通常从CWinApp派生,对话框从...

    Bubble Sort-冒泡排序算法-少儿编程scratch项目源代码文件案例素材.zip

    在这个项目中,我们将使用Scratch这种图形化编程语言来演示冒泡排序的过程。 Scratch是麻省理工学院(MIT)的“终身幼儿园团队”开发的一款面向儿童的编程工具,它以积木块的形式让编程变得直观易懂。在"bubble sort...

    事件冒泡排序VI

    在编程领域,冒泡排序是一种基础且直观的排序算法,尤其在LabVIEW这种图形化编程环境中,它可以通过直观的流程图来实现。本教程将详细讲解如何利用LabVIEW的事件结构来实现冒泡排序功能。 首先,理解冒泡排序的基本...

    冒泡排序单步演示

    ### 冒泡排序单步演示知识点解析 ...通过以上分析可以看出,这段代码实现了冒泡排序的可视化演示,不仅展示了冒泡排序的基本思想,还结合了图形用户界面,使得学习者能够更好地理解冒泡排序的过程。

    冒泡排序小游戏

    至于“pic”文件,可能是包含与冒泡排序相关的图形或动画,用以辅助解释排序的过程,使用户更容易理解冒泡排序的工作方式。这些图像可能显示了数组在每一轮比较后的状态变化,直观地展示元素如何逐步达到正确的位置...

    scratch2源码Bubble Sort-冒泡排序算法

    在Scratch2这个图形化编程环境中,我们可以用积木块来实现冒泡排序算法,这有助于初学者理解排序算法的工作原理。 首先,我们要明确冒泡排序的基本步骤: 1. **初始遍历**:从列表的第一个元素开始,比较它与下一个...

Global site tag (gtag.js) - Google Analytics