基本要求: 1、可以自擬題目,自擬的題目需要經過老師審覈通過。 2、每個題目不設最高要求。 3、根據數據分析、數據結構設計、算法設計、功能設計、界面設計、系統實現、答辯情況以 及實驗報告等綜合進行成績評定。 4、要求實現一個界面美觀、功能完整、具有實用性的系統。 5、不限制編程語言,可以使用 JAVA。 6、完成本課程設計,需要查閱資料與文獻,需要將參閱的文獻列出。
A 類(係數 1.2) :
1、 線性結構的存儲及操作的動畫演示以及對應實際運行結果展示。包括:線性表、棧、隊列(兩種存儲)。 要求:算法(程序代碼)執行與存儲結構的同步動態變化。
2、 二叉樹與樹的存儲與操作的動畫演示以及對應實際運行結果展示。包含各種基本操作。
3、 圖的存儲與操作的動畫演示以及對應實際運行結果展示。包括:各種基本操作與算法。
4、查找的基本操作動畫演示以及對應實際運行結果展示。包括:二叉排序樹、平衡二叉樹、B-樹。
5、 排序的基本操作動畫演示以及對應實際運行結果展示。包括:各種排序算法。
1)、界面
2)、實現效果:
3)、主界面代碼
package sortingpackage;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import java.io.*;
import java.util.Arrays;
/**
* @ClassName: Main
* @description: 主界面類
* @author: Cyril_KI
* @Date: 2019年12月20日 上午11:16:19
*/
class MainGUI{
JFrame frame;
JPanel panel1,panel2,panel3,panel4;
JLabel speedLabel;
JList<String> listCode;
JMenuBar menuBar;
JScrollPane pane;
String str;
DefaultListModel<String> model;
JButton startButton,deceButton,acceButton,buttonStep,outLoopButton;
JMenu insertMenu,selectMenu,exchangeMenu,mergeMenu,radixMenu;
JMenuItem []items=new JMenuItem[9];
String []data={"直接插入排序","折半插入排序","希爾排序","簡單選擇排序","堆排序","冒泡排序","快速排序","歸併排序","基數排序"};
public MainGUI() {
frame=new JFrame();
panel1=new JPanel();
panel2=new JPanel();
panel2.setLayout(new GridLayout(1, 3));
str= "代碼區 ";
model=new DefaultListModel<String>();
listCode=new JList<String>(model);
model.add(0, str);
speedLabel=new JLabel("當前速度爲1000",JLabel.CENTER);
panel3=new JPanel();
panel3.setLayout(new BorderLayout());
//panel1.setBorder(BorderFactory.createLoweredBevelBorder());
Border border1=BorderFactory.createLoweredBevelBorder();
panel1.setBorder(BorderFactory.createTitledBorder(border1,"動畫演示區"));
panel2.setBorder(BorderFactory.createTitledBorder(border1,"功能區"));
listCode.setBackground(Color.darkGray);
listCode.setForeground(Color.orange);
pane=new JScrollPane(listCode);
panel3.add(pane);
Border border=BorderFactory.createEtchedBorder();
panel3.setBorder(border);
ImageIcon startIcon=new ImageIcon("start.jpg");
ImageIcon stopIcon=new ImageIcon("stop.jpg");
ImageIcon continueIcon=new ImageIcon("continue.jpg");
startButton=new JButton("完整演示");
startButton.setFont(new Font("宋體",Font.BOLD,25));
startButton.setBackground(Color.LIGHT_GRAY);
startButton.setPreferredSize(new Dimension(stopIcon.getIconWidth(), stopIcon.getIconHeight()));
acceButton=new JButton("加速");
acceButton.setBackground(Color.LIGHT_GRAY);
acceButton.setFont(new Font("宋體",Font.BOLD,25));
//acceButton.setForeground(Color.YELLOW);
deceButton=new JButton("減速");
deceButton.setBackground(Color.LIGHT_GRAY);
deceButton.setFont(new Font("宋體",Font.BOLD,25));
buttonStep=new JButton("單步執行");
buttonStep.setBackground(Color.white);
buttonStep.setForeground(Color.RED);
buttonStep.setFont(new Font("宋體",Font.BOLD,25));
outLoopButton=new JButton("跳出循環");
startButton.setBorder(BorderFactory.createLoweredBevelBorder());
acceButton.setBorder(BorderFactory.createLoweredBevelBorder());
deceButton.setBorder(BorderFactory.createLoweredBevelBorder());
buttonStep.setBorder(BorderFactory.createLoweredBevelBorder());
speedLabel.setFont(new Font("宋體",Font.BOLD,25));
speedLabel.setBorder(BorderFactory.createLoweredBevelBorder());
panel4=new JPanel();
panel4.setLayout(new GridLayout(1,2));
panel4.add(buttonStep);//panel4.add(outLoopButton);
panel4.add(speedLabel);
panel3.add(BorderLayout.SOUTH,panel4);
panel2.add(startButton);//panel2.add(pauseButton);panel2.add(continueButton);
panel2.add(acceButton);panel2.add(deceButton);
menuBar=new JMenuBar();
insertMenu=new JMenu("插入");
selectMenu=new JMenu("選擇");
exchangeMenu=new JMenu("交換");
mergeMenu=new JMenu("歸併");
radixMenu=new JMenu("基數");
for(int i=0;i<items.length;i++) {
items[i]=new JMenuItem(data[i]);
}
insertMenu.add(items[0]);insertMenu.addSeparator();insertMenu.add(items[1]);insertMenu.addSeparator();
insertMenu.add(items[2]);
selectMenu.add(items[3]);selectMenu.addSeparator();selectMenu.add(items[4]);
exchangeMenu.add(items[5]);exchangeMenu.addSeparator();exchangeMenu.add(items[6]);
mergeMenu.add(items[7]);
radixMenu.add(items[8]);
menuBar.add(insertMenu);
menuBar.add(selectMenu);
menuBar.add(exchangeMenu);
menuBar.add(mergeMenu);
menuBar.add(radixMenu);
frame.setJMenuBar(menuBar);
frame.add(BorderLayout.CENTER,panel1);
frame.add(BorderLayout.SOUTH,panel2);
frame.add(BorderLayout.EAST,panel3);
for(int i=0;i<9;i++) {
items[i].addActionListener(new EventAction(this));
}
startButton.addActionListener(new EventAction(this));
acceButton.addActionListener(new EventAction(this));
deceButton.addActionListener(new EventAction(this));
buttonStep.addActionListener(new EventAction(this));
frame.setSize(1200, 800);
//frame.setSize(800, 600);
frame.setTitle("DynamicSorting");
frame.setVisible(true);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
}
}
class EventAction implements ActionListener{
MainGUI gui;
int [][]codeNum=new int[9][];
int pivot=0,low=0,high=0,temp=0;
static String flag=""; //判斷執行哪一個操作函數
static int speed=1000,card=0,card1=0;
static int index=1,index1=0,current=0;
static int width=1,flagBinser=1;
static int flagStep=0,flagBubble=0,flagSelect=0;
static int flagDirec=1,flagDirect=1,gap=0;
static boolean flagIndex=true;
static boolean []cleanFlag= new boolean[9];
Graphics graphics;
//int []x= {41,100,63,12,4,45,8,55,11,68,93};
int []x= {70,73,70,23,93,18,11,68};
int []radix= {70,83,45,78,37,16,22,57,11,99};
static int flagHeap=0;
//int []x= {1,3,4,5,2};
PaintRec paintRec;
SortingFunction function;
public EventAction(MainGUI gui) {
this.gui=gui;
paintRec=new PaintRec(gui); //創建畫圖對象
function=new SortingFunction(gui);
codeNum[0]=new int[20];codeNum[1]=new int[20];codeNum[2]=new int[20];codeNum[3]=new int[20];codeNum[4]=new int[13];
codeNum[5]=new int[20];codeNum[6]=new int[20];codeNum[7]=new int[20];codeNum[8]=new int[20];
for(int i=0;i<codeNum.length;i++) {
for(int j=0;j<codeNum[i].length;j++) {
codeNum[i][j]=j+1;
}
}
for(int i=0;i<cleanFlag.length;i++) {
cleanFlag[i]=true;
}
graphics=gui.panel1.getGraphics();
}
public void recover() { //每次排序之後都要復原,方便進行下一次排序
int []x= {70,73,70,23,93,18,11,68};
int []radix= {70,83,45,78,37,16,22,57,11,99};
this.x=Arrays.copyOfRange(x, 0, x.length);
this.radix=Arrays.copyOfRange(radix, 0, radix.length);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==gui.acceButton) { //設置加速,且只能在一開始就設置加速
if(speed>=100) {
speed-=100;
PaintRec.speed=EventAction.speed; //設置速度
gui.speedLabel.setText("當前速度爲"+String.valueOf(2000-PaintRec.speed));
//JOptionPane.showMessageDialog(gui.frame, "當前速度爲"+String.valueOf(2000-PaintRec.speed), "提示", JOptionPane.INFORMATION_MESSAGE);
}
else {
JOptionPane.showMessageDialog(gui.frame, "已達到最快速度!!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
}
if(e.getSource()==gui.deceButton) {
if(2000-speed>=200) {
speed+=100;
PaintRec.speed=EventAction.speed;
gui.speedLabel.setText("當前速度爲"+String.valueOf(2000-PaintRec.speed));
}
else {
JOptionPane.showMessageDialog(gui.frame, "已是最慢速度!!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
}
if(e.getActionCommand()=="冒泡排序") {
try {
File file=new File("冒泡排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="冒泡排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"冒泡排序"));
}
if(e.getActionCommand()=="快速排序") {
try {
File file=new File("快速排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="快速排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"快速排序"));
}
if(e.getActionCommand()=="直接插入排序") {
try {
File file=new File("直接插入排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="直接插入排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"直接插入排序"));
}
if(e.getActionCommand()=="折半插入排序") {
try {
File file=new File("折半插入排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="折半插入排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"折半插入排序"));
}
if(e.getActionCommand()=="希爾排序") {
try {
File file=new File("希爾排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="希爾排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"希爾排序"));
}
if(e.getActionCommand()=="簡單選擇排序") {
try {
File file=new File("簡單選擇排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="簡單選擇排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"簡單選擇排序"));
}
if(e.getActionCommand()=="堆排序") {
try {
File file=new File("堆排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flagHeap=x.length-1; //後續單步演示
flag="堆排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"堆排序"));
}
if(e.getActionCommand()=="歸併排序") {
try {
File file=new File("歸併排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="歸併排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"歸併排序"));
}
if(e.getActionCommand()=="基數排序") {
try {
File file=new File("基數排序.txt");
String str;
BufferedReader reader=new BufferedReader(new FileReader(file));
gui.model=new DefaultListModel<String>();
gui.model.add(0, gui.str);
int index=1;
while((str=reader.readLine())!=null) {
gui.model.add(index, str);
index++;
}
reader.close();
gui.listCode.setModel(gui.model);
gui.listCode.setSelectedIndex(0);
} catch (IOException e2) {
e2.printStackTrace();
}
flag="基數排序";
Border border=BorderFactory.createLoweredBevelBorder();
gui.panel1.setBorder(BorderFactory.createTitledBorder(border,"基數排序"));
}
//完整過程演示
if(e.getSource()==gui.startButton&&flag.equals("冒泡排序")) {
function.bubbleSort(x);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("直接插入排序")) {
function.insertSort(x);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("簡單選擇排序")) {
function.selectionSort(x);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("希爾排序")) {
function.shellSort(x);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("快速排序")) {
function.QuickSort(x, 0, x.length-1,true,true);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("折半插入排序")) {
function.binsertSort(x);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("堆排序")) {
function.heapSort(x);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("歸併排序")) {
function.mergeSort(x);
recover();
}
if(e.getSource()==gui.startButton&&flag.equals("基數排序")) {
function.radixSort(radix);
recover();
}
if(e.getSource()==gui.startButton&&flag.length()<2||e.getSource()==gui.buttonStep&&flag.length()<2) {
JOptionPane.showMessageDialog(gui.frame, "請先在菜單中選擇一種排序方式!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
if(e.getSource()==gui.buttonStep&&flag.length()>=2&&flag.substring(flag.length()-2).equals("排序")) {
gui.listCode.setSelectedIndex(index);
if(flag.equals("堆排序")) {
if(cleanFlag[0]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[0]=false;
}
if(index==5) {
function.heapSortInit(x);
}
if(flagHeap>0) {
if(index==11) {
function.heapSortStepsOut(x,flagHeap);
flagHeap--;
index=6;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
if(index==6&&flagHeap==0) {
index=12;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(index==13) {
Graphics graphics=gui.panel1.getGraphics();
graphics.clearRect(150, 450, 450 , 80);
graphics.setFont(new Font("宋體",Font.BOLD,25));
graphics.setColor(Color.black);
graphics.drawString("調整完畢,最終序列即樹結點逆序序列:", 120, 500);
function.heapSortLast(x);
}
if(index==13) {
index=0;
recover();
}
}
if(flag.equals("歸併排序")) {
if(cleanFlag[1]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[1]=false;
}
if(flagDirec==x.length-1) {
index=12;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(index==7) {
if(width<x.length) {
function.mergeSortSingleStep(width, x);
width*=2;
index=5;
flagIndex=false;
if(width<x.length) {
gui.listCode.setSelectedIndex(index);
}
else {
index=8;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
else {
index=10;
flagIndex=false;
gui.listCode.setSelectedIndex(index);
}
}
if(index==9) {
index=0;
recover();
}
}
if(flag.equals("基數排序")) {
if(cleanFlag[2]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[2]=false;
}
if(index==16) {
function.radixSortInit(radix); //初始化
}
if(index==22&&flagStep==0) {
function.radixSortCore1(radix, 10, 1); //第一次分配
flagStep++;
}
if(index==27&&flagStep==1) { //第一次收集
function.radixSortCore2(radix, function.bucketList1);
flagStep++;
}
if(index==29&&flagStep==2) { //回到循環初始位置
index=18;
flagIndex=false;
gui.listCode.setSelectedIndex(index);
}
if(index==22&&flagStep==2) {
function.radixSortCore1(radix, 100, 10); //第二次分配
flagStep++;
}
if(index==27&&flagStep==3) { //第二次收集
function.radixSortCore2(radix, function.bucketList1);
}
if(index==31) {
Graphics graphics=gui.panel1.getGraphics();
graphics.setColor(Color.black);
graphics.setFont(new Font("宋體",Font.BOLD,25));
graphics.drawString("RaidxSorting Completed!!", 190, 500);
}
if(index==32) {
index=0;
recover();
}
}
if(flag.equals("直接插入排序")) { //OK
if(cleanFlag[3]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[3]=false;
}
if(card==0&&flagDirec<x.length) {
index1=flagDirec;
current=x[flagDirec];
card++;
}
if(index==3) {
function.paintRec.directInsertInit(x);
}
if(index==3&&flagDirec==x.length) {
index=12;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(flagDirec<x.length) {
if(index==4) {
function.paintRec.directInsertDown(x, flagDirec,PaintRec.speed); //第待排序長方形塊下落
}
if(index==8) { //尋找插入位置
while(index1-1 >= 0 && current < x[index1-1]){
function.paintRec.directInsertLeft(x, index1,current,PaintRec.speed);
x[index1] = x[index1-1]; //小矩形右移
index1--; //這裏的數怎麼能夠保存下來呢
}
}
if(index==10) {
function.paintRec.directInsertUp(x, index1,current,PaintRec.speed); //找到插入位置
x[index1]=current;
flagDirec++; //i++
card=0; //進行下一輪循環
index=3;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
if(index==13) {
Graphics graphics=gui.panel1.getGraphics();
graphics.setColor(Color.black);
graphics.setFont(new Font("宋體",Font.BOLD,25));
graphics.drawString("Completed!!", 270, 500);
}
if(index==14) {
index=0;
recover();
}
}
if(flag.equals("冒泡排序")) {
if(cleanFlag[4]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[4]=false;
}
if(index==3) {
function.initBubble(x); //初始化
if(flagBubble==x.length) { //跳出循環
index=12;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
if(flagBubble<x.length) {
if(index==7) {
function.bubbleSortExchange(flagBubble, x);
flagBubble++;
index=3;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
if(index==14) {
index=0;
recover();
}
}
if(flag.equals("快速排序")) {
if(cleanFlag[5]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[5]=false;
}
if(index==2) {
function.quickInit(x);
}
if(index==4) {
pivot=function.partition(x, 0, x.length-1);//得到第一輪排序的基準所落位置
}
if(index==6) {
function.paintRec.quickSortClean(pivot,PaintRec.speed); //清除重合的兩個箭頭
function.paintRec.quickSortInit(x, 0, pivot-1);
function.quickLeft(x, 0, pivot-1);
}
if(index==8) {
function.paintRec.quickSortClean(0,PaintRec.speed); //清除重合的兩個箭頭
function.paintRec.quickSortInit(x, pivot+1, x.length-1);
function.quickRight(x, pivot+1, x.length-1);
}
if(index==9) {
index=0;
recover();
}
}
if(flag.equals("簡單選擇排序")) {
if(cleanFlag[6]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[6]=false;
}
if(index==2) {
function.paintRec.bubbleSortInit(x); //初始化
}
if(index==3&&flagSelect==x.length) {
index=17;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(index==12) {
if(flagSelect<x.length) {
int minIndex = flagSelect;
for(int j = flagSelect;j<x.length;j++){//遍歷未剩餘未排序元素中繼續尋找最小元素
if(x[j] < x[minIndex]){
minIndex = j;
}
}
if(minIndex != flagSelect){
function.paintRec.bubbleSortExchange(flagSelect, minIndex, x.length, x,PaintRec.speed);
int temp = x[minIndex];
x[minIndex] = x[flagSelect];
x[flagSelect] = temp;
}
flagSelect++;
index=3;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
if(index==18) {
index=0;
recover();
}
}
if(flag.equals("希爾排序")) {
if(cleanFlag[7]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[7]=false;
}
if(index==2) { //初始化
function.paintRec.shellSortInit(x);
}
if(index==4) {
gap=x.length/2;
function.paintRec.drawShellGap(gap,PaintRec.speed);
}
if(index==5&&gap==0) {
index=18;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(gap>0) {
if(index==12) {
for(int i = gap;i < x.length;i++) {
int temp = x[i]; //待插入結點上移
function.paintRec.shellUp(x, i,PaintRec.speed);
int index = i - gap;
while(index >= 0 && x[index] > temp) {
function.paintRec.shellLeft(x, index+gap, temp, gap,PaintRec.speed);
x[index + gap] = x[index]; //後移一個元素
index -= gap;
}
function.paintRec.shellDown(index+gap, x, temp,PaintRec.speed);
x[index + gap] = temp; //待插入元素下落
}
}
if(index==15) {
gap/=2;
function.paintRec.drawShellGap(gap,PaintRec.speed);
index=5;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
if(gap<0) {
index=17;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(index==19) {
index=0;
recover();
}
}
if(flag.equals("折半插入排序")) {
if(cleanFlag[8]) {
graphics=gui.panel1.getGraphics();
graphics.clearRect(gui.panel1.getX(), gui.panel1.getY(), gui.panel1.getWidth(), gui.panel1.getHeight());
cleanFlag[8]=false;
}
if(card1==0&&flagBinser<x.length) {
low=0;
high=flagBinser-1;
temp=x[flagBinser];
card1++;
}
if(index==1) {
Graphics graphics=gui.panel1.getGraphics();
graphics.setColor(Color.black);
graphics.setFont(new Font("宋體",Font.BOLD,25));
graphics.drawString("插入位置爲high+1!!", 200, 500);
paintRec.binsertSortInit(x, 0, 0); //初始狀態下畫圖
}
if(index==2&&flagBinser==x.length) { //跳出循環
index=20;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(flagBinser<x.length) {
if(index==5) {
paintRec.drawArrowAgain(low, high, x,PaintRec.speed);
paintRec.binsertSortUp(flagBinser, x,PaintRec.speed);
}
if(index==8) { //找到插入位置
while(low<=high) { //
int mid = (high+low)/2;
if(x[mid]<temp) {
//不移動直接全部刪掉重新設置箭頭避免麻煩
paintRec.drawArrowAgain(mid+1, high, x,PaintRec.speed);
low = mid+1;
}
else {
paintRec.drawArrowAgain(low, mid-1, x,PaintRec.speed);
high = mid-1;
}
}
index=14;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
if(index==17) {
for (int j = flagBinser-1; j > high; --j) {
paintRec.binsertSortReplacement(x, j,PaintRec.speed);
x[j+1] = x[j]; //array[j]上升然後右移到array[j+1]上方,此時array[j+1]同步消失,然後上方圓形數據下落
}
}
if(index==19) {
paintRec.binsertSortLastSteps(high, temp,flagBinser,PaintRec.speed);
x[high+1] = temp;
flagBinser++;
card1=0; //新的一輪排序過程
index=2;
gui.listCode.setSelectedIndex(index);
flagIndex=false;
}
}
if(index==21) {
paintRec.binsertClean(x);
index=0;
recover();
}
}
if(flagIndex) {
index++;
}
flagIndex=true;
}
}
}
public class Main {
public static void main(String[] args) {
new MainGUI();
}
}
項目資源:
完整代碼