这是我的第一个blog
希望有错误的,有bug请一定提出,楼主大二了刚学java请多多指点
我们都知道有很多的排序算法,但是没有直观的显示是如何排序的,今天我给大家带来
Java Swing awt 实现的可视化的排序
下面是排序的效果
话不多说我直接附上代码;
首先进行排序我们需要一个数组的类;
类中包含set get方法,还有一些基本的方法
并且这个类将会作为父类,覆盖其中的排序方法就可以实现不同的排序
package com.Sort;
public class SetSort {
protected int array[];
protected int currentIndex=-1;
protected int orderedIndex=-1;
protected int minIndex=-1;
public SetSort(int height,int lenght){
array=new int[lenght];
init(height);
}
protected void init(int rand){
for (int i=0;i<array.length;i++){
array[i]=(int)(Math.random()*rand)+1;
}
}
public int getSize(){
return array.length;
}
public int getData(int index){
if(index<0||index>array.length){
throw new IllegalArgumentException("Errno");
}
return array[index];
}
public void setCurrentIndex(int index){
this.currentIndex=index;
}
public void setOrderedIndex(int index){
this.orderedIndex=index;
}
public void setMinIndex(int index){
this.minIndex=index;
}
public int getCurrentIndex(){
return currentIndex;
}
public int getOrderedIndex(){
return orderedIndex;
}
public int getMinIndex(){
return minIndex;
}
protected void swap(int index,int index1){
int temp=array[index];
array[index]= array[index1];
array[index1]=temp;
}
//可以复写
public void sort(SortFrame panel){
// 更新绘制
panel.setIndex(0,-1,-1);
// 选择排序算法
for(int i = 0;i < getSize();i++){
int minIndex = i;
panel.setIndex(i,-1,minIndex);
for(int j = i+1;j <getSize();j++){
panel.setIndex(i,j,minIndex);
if(getData(j) < getData(minIndex))
minIndex = j;
panel.setIndex(i,j,minIndex);
}
swap(i,minIndex);
panel.setIndex(i+1,-1,-1);
}
panel.setIndex(getSize(),-1,-1);
}
}
其次是对数组排序进行复制绘图的类
这个类对图像的绘图进行帮助
package com.Sort;
import java.awt.*;
import java.awt.geom.Rectangle2D;
public class SortVisAid {
private SortVisAid(){}
public static void setColor(Graphics2D g,Color color){
g.setColor(color);
}
public static void filledRectangle(Graphics2D g,int x,int y,int w,int h){
Rectangle2D rectangle=new Rectangle2D.Double(x,y,w,h);
g.fill(rectangle);
}
public static void setText(Graphics2D g,int value,int x,int y){
g.drawString(String.valueOf(value),x,y);
}
public static void speed(int time){
try{
Thread.sleep(time);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
*然后是 画布的类,并且要覆盖其中的绘图方法才可以进行自定义的绘图*
package com.Sort;
import javax.swing.*;
import java.awt.*;
public class SortPanel extends JPanel{
private SetSort array;
private int canvansWidth;
private int canvansHeight;
public SortPanel(SetSort array,int canvansWidth,int canvansHeight){
super(true); //设置为双缓冲,Jpanel 现在默认是双缓冲
this.array=array;
this.canvansWidth=canvansWidth;
this.canvansHeight=canvansHeight;
}
//实现重绘
public void paintComponent(Graphics graphics){
Graphics2D graphics2D=(Graphics2D)graphics;
int w=canvansWidth/array.getSize();
for (int i=0;i<array.getSize();i++){
if (i<array.getOrderedIndex())
SortVisAid.setColor(graphics2D,Color.GREEN);
else SortVisAid.setColor(graphics2D,Color.BLACK);
if (i==array.getCurrentIndex())SortVisAid.setColor(graphics2D,Color.BLUE);
if (i==array.getMinIndex())SortVisAid.setColor(graphics2D,Color.WHITE);
SortVisAid.filledRectangle(graphics2D,i*w,canvansHeight-array.getData(i),w-2,array.getData(i));
SortVisAid.setText(graphics2D,array.getData(i),i*w+w/4,canvansHeight-array.getData(i));
}
}
public Dimension getPreferredSize(){
return new Dimension(canvansWidth,canvansHeight);
}
}
*然后是窗口的显示,这里我们用JDialog作为显示排序的基层
如果用JFrame也行,但是要考虑很多情况,线程的问题*
package com.Sort;
import javax.swing.*;
import java.awt.*;
public class SortFrame extends JDialog {
private SortPanel panel;
private SetSort array;
public void run(){
array.sort(this);
}
public void setIndex(int orderedIndex,int currentCompareIndex,int currentMinIndex){
array.setCurrentIndex(currentCompareIndex);
array.setOrderedIndex(orderedIndex);
array.setMinIndex(currentMinIndex);
repaint();
SortVisAid.speed(300);
}
public SortFrame(String title,int w,int h,SetSort array){
panel=new SortPanel(this.array=array,w,h);
//开始线程
//继承Thread或者Runnable 也可以实现,但是最好使用下列的
EventQueue.invokeLater(()->{
new Thread(()->{
run();
}).start();
});
getContentPane().add(panel);
setSize(w,h);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
***button 的多少可以自己定义,new 的数组类型可以继承SetArray实现***
package com.Sort;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main extends JFrame implements ActionListener {
private JButton button[]=new JButton[5];
private JPanel panel;
private String str[]=new String[]{"插入排序","冒泡排序","选择排序","快速排序","堆排序"};
private int w;
private int h;
private SetSort array;
private Main(String title ,int w,int h,SetSort array){
super(title);
init();
this.w=w;
this.h=h;
this.array=array;
setVisible(true);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent event){
if (event.getActionCommand().equals("选择排序")){
SortFrame frame=new SortFrame("选择排序",w,h,array);
setContentPane(frame);
}else if(event.getActionCommand().equals("冒泡排序")){
SortFrame frame=new SortFrame("冒泡排序",w,h,new BubbleSort(400,4));
setContentPane(frame);
}else if(event.getActionCommand().equals("插入排序")){
}else if(event.getActionCommand().equals("快速排序")){
}else {
}
}
private void init(){
panel=new JPanel(new FlowLayout());
for (int i=0;i<button.length;i++){
button[i]=new JButton(str[i]);
button[i].addActionListener(this);
panel.add(button[i]);
}
getContentPane().add(panel);
}
public static void main(String argv[]){
new Main("插入排序",600,400,new SetSort(400,12));
}
}
***继承SetArray 实现一个冒泡排序***
package com.Sort;
public class BubbleSort extends SetSort {
public BubbleSort(int height, int lenght) {
super(height, lenght);
}
@Override
public void sort(SortFrame panel) {
panel.setIndex(-1,-1,-1);
for (int i=0;i<getSize()-1;i++){
panel.setIndex(i,-1,-1);
for (int j=i+1;j<getSize();j++){
panel.setIndex(i,j,-1);
if(array[i]>array[j]){
panel.setIndex(i,i,j);
swap(i,j);
}
panel.setIndex(i+1,-1,-1);
}
panel.setIndex(getSize(),-1,-1);
}
}
}
***最后我也是参考了别人的代码而重写
附上来源的地址***
[我觉得他讲的很好很仔细](https://blog.csdn.net/GO_D_OG/article/details/100016060?utm_source=app)