文章目錄
- 前言
- 一、程式的總體思路
- 二、五種排序演算法
- 1.冒泡排序演算法
- 2.簡單選擇排序
- 3.直接插入排序
- 4.折半插入排序
- 5.希爾排序
- 三、選單界面實作
- 1.面板類
- 2.視窗事件
- 3.動作事件
- 四、具體代碼
- 五、效果圖
- 總結
前言
小編由于期末考試,太忙了,所以最近沒有更新,希望諒解,本次針對小編結課實訓寫的一個簡單排序程式作為講解,主要是排序的五種方式和Java圖形界面的運用,適合初學者理解排序演算法、GUI、事件處理、以及面向象的編程思想,一、程式的總體思路

這里簡單介紹一下該程式的主體框架,主要分為兩部分,第一部分是排序演算法,第二部分是選單的圖形的實作,下面具體介紹:
二、五種排序演算法
1.冒泡排序演算法
- 演算法的實作思路
- 比較大小
- 交換位置
- 代碼實作
public int[] bubbleSort(int[] array) {
// 如果為陣列為慷訓傳原陣列
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1 - i; j++)
// 找到大的值交換
if (array[j + 1] < array[j]) {
swap(array, j, j + 1);
}
Display(array);
}
return array;
}
2.簡單選擇排序
- 演算法實作思路
- 假設一個最小值
- 依次比較找到最小值記錄下標
- 交換待排數與最小值
- 代碼實作
public int[] selectionSort(int[] array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) // 找到最小的數
minIndex = j; // 將最小數的索引保存
}
swap(array, minIndex, i);
Display(array);
}
return array;
}
3.直接插入排序
- 演算法實作思路
- 尋找插入位置
- 將待插入位置及后面的依次向后移動
- 將待排元素插入
- 代碼實作
public int[] insertionSort(int[] array) {
if (array.length == 0)
return array;
int current;
for (int i = 0; i < array.length - 1; i++) {
// 記錄待排的數
current = array[i + 1];
int preIndex = i;
while (preIndex >= 0 && current < array[preIndex]) {
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = current;
Display(array);
}
return array;
}
4.折半插入排序
- 演算法實作思路
- 記錄上、下、及待排坐標位置
- 回圈比較待排數與中間位置元素的大小縮小查找范圍
- 找到插入位置,插入待排元素
- 代碼實作
public int[] binaryInsertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
if (array[i] < array[i - 1]) {
// 快取i處的元素值
int tmp = array[i];
// 記錄搜索范圍的左邊界下標
int low = 0;
// 記錄搜索范圍的右邊界下標
int high = i - 1;
while (low <= high) {
// 記錄中間位置下標
int mid = (low + high) / 2;
// 比較中間位置資料和i處資料大小,以縮小搜索范圍
if (array[mid] < tmp) {
low = mid + 1;
} else {
high = mid - 1;
}
}
// 將low~i處資料整體向后移動1位
for (int j = i; j > low; j--) {
array[j] = array[j - 1];
}
// 將待排數插入
array[low] = tmp;
Display(array);
}
}
return array;
}
5.希爾排序
- 演算法實作思路
- 確定步長
- 中間開始外層回圈向后,內層回圈向前
- 按大小交換位置
- 縮小步長
- 代碼實作
public int[] ShellSort(int[] array) {
int len = array.length;
int temp, gap = len / 2;// 步長每次減半
while (gap > 0) {
//從中間開始
for (int i = gap; i < len; i++) {
temp = array[i];
//記錄前一個步長位置
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
Display(array);
}
return array;
}
三、選單界面實作
總體思路很簡單,選單實作類繼承JFrame類,設定表單屬性,添加設定好的面板,為更好的體現面向物件的思想,將面板也建立一個單獨的類,在類體內實作各個面板并添加個組件,給組件設定監聽器,為事件回應也建立一個單獨的類,實作ActionListener介面,設定相對應的回應事件,
簡單看一下效果,背景圖片是我們宿舍樓,
1.面板類
- 按鈕組件
以“冒泡排序”按鈕為例
Button bubbleSort = new Button("冒泡排序");
//設定字體 字號
bubbleSort.setFont(new Font("宋體", 0, 13));
- 文本框組件
//創建文本框
JTextField inputTextField = new JTextField(20);
- 標簽組件
JLabel label = new JLabel("輸入數字以逗號分開");
2.視窗事件
主要實作WindowListener介面,對對應的事件回應進行編輯,
- 正在關閉事件
- 關閉事件
- 移出視窗事件
3.動作事件
- 按鈕動作
- 文本框動作
分為兩步,第一步對相應的組件添加監聽器,第二步在動作回應類內編輯對應功能模塊,
四、具體代碼
選單界面
package 排序.test1;
import java.awt.BorderLayout;
import javax.swing.JFrame;
public class Menu extends JFrame {
/**
* 視圖視窗
*/
public Menu() {
this.setTitle("賈振宇的排序選擇選單");
// 設定表單大小
this.setSize(450, 400);
// this.setLocationByPlatform(true);
// 顯示視窗位置
this.setLocationRelativeTo(null);
//this.setLocation(300, 200);
// 視窗不能更改
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
//設定為邊界布局
this.setLayout(new BorderLayout());
//下邊界
this.add(PanelAll.southPanel(), BorderLayout.SOUTH);
//上邊界
this.add(PanelAll.northPanel(), BorderLayout.NORTH);
//正中間
this.add(PanelAll.cenPanel(), BorderLayout.CENTER);
//顯示視窗
this.setVisible(true);
}
}
面板類
package 排序.test1;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
public class PanelAll {
public static Button bubbleSort, selectSort, insertionSort, shellSort, binaryInsertSort;
static JButton jButton;
public static JTextField inputTextField;
public static JTextArea showArea;
/**
* 中間面板
*
* @return
*/
public static JPanel cenPanel() {
//背景圖片
ImageIcon image = new ImageIcon("images/qg.jpg");
//new 一個Jlabel存圖片
JLabel jLabel = new JLabel(image);
//圖片位置
jLabel.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
//新建一個面板
JPanel cenJPanel = new JPanel();
//邊界布局
cenJPanel.setLayout(new BorderLayout());
//文本框
showArea = new JTextArea(1, 20);
showArea.setEditable(false);
//新建展示結果面板
JPanel showJPanel = new JPanel();
showJPanel.setLayout(new FlowLayout());
JLabel label = new JLabel("排序結果:");
jButton = new JButton("顯示排序結果");
//設定監聽器
jButton.addActionListener(new MyActionlistener());
//添加
showJPanel.add(label);
showJPanel.add(showArea);
showJPanel.add(jButton);
//滾動面板
JScrollPane jScrollPane = new JScrollPane();
//顯示方式
jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPane.setViewportView(showJPanel);
//添加位置
cenJPanel.add(jScrollPane, BorderLayout.SOUTH);
cenJPanel.add(jLabel, BorderLayout.NORTH);
return cenJPanel;
}
/**
* 下方面板
*
* @return
*/
public static JPanel southPanel() {
//創建文本框
inputTextField = new JTextField(20);
//創建面板
JPanel southPanel = new JPanel();
southPanel.setLayout(new FlowLayout());
JLabel label = new JLabel("輸入數字以逗號分開");
JButton btnButton = new JButton("確定");
//設定監聽器
btnButton.addActionListener(new MyActionlistener());
southPanel.add(label);
southPanel.add(inputTextField);
southPanel.add(btnButton);
return southPanel;
}
/**
* 上方面板
*
* @return
*/
public static JPanel northPanel() {
JPanel northPanel = new JPanel();
northPanel.setLayout(new FlowLayout());
//建立按鈕 與監聽
bubbleSort = new Button("冒泡排序");
//設定字體 字號
bubbleSort.setFont(new Font("宋體", 0, 13));
bubbleSort.addActionListener(new MyActionlistener());
selectSort = new Button("簡單選擇排序");
selectSort.addActionListener(new MyActionlistener());
insertionSort = new Button("直接插入排序");
insertionSort.addActionListener(new MyActionlistener());
shellSort = new Button("希爾排序");
shellSort.addActionListener(new MyActionlistener());
binaryInsertSort = new Button("折半插入排序");
binaryInsertSort.addActionListener(new MyActionlistener());
northPanel.add(bubbleSort);
northPanel.add(selectSort);
northPanel.add(insertionSort);
northPanel.add(binaryInsertSort);
northPanel.add(shellSort);
return northPanel;
}
}
動作事件類
package 排序.test1;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
/**
* 事件處理類
*
* @author zhenyu
*
*/
public class MyActionlistener implements ActionListener {
// 靜態陣列用于儲存資料
static int array[];
public void actionPerformed(ActionEvent e) {
SortAll sortAll = new SortAll();
if (e.getActionCommand().equals("確定")) {
// 獲取字串
String text = PanelAll.inputTextField.getText();
// 決議字串
String[] split = text.split(",");
Integer valueOf;
array = new int[split.length];
for (int i = 0; i < split.length; i++) {
valueOf = Integer.valueOf(split[i]);
// System.out.println(valueOf);
array[i] = valueOf;
}
System.out.println("決議成功!");
PanelAll.inputTextField.setText("");
}
// 五種排序按鈕的觸發事件
if (e.getActionCommand().equals("冒泡排序")) {
System.out.println("下面是冒泡排序");
int[] copyArray = Arrays.copyOfRange(array, 0, array.length);
long statr = System.currentTimeMillis();
sortAll.bubbleSort(copyArray);
long end = System.currentTimeMillis();
System.out.println("冒泡排序用時:" + (end - statr) + "ms");
System.out.println("========================================");
}
if (e.getActionCommand().equals("簡單選擇排序")) {
System.out.println("下面是選擇排序");
int[] copyArray = Arrays.copyOfRange(array, 0, array.length);
long statr = System.currentTimeMillis();
sortAll.selectionSort(copyArray);
long end = System.currentTimeMillis();
System.out.println("簡單選擇排序用時:" + (end - statr) + "ms");
System.out.println("========================================");
}
if (e.getActionCommand().equals("直接插入排序")) {
System.out.println("下面是直接插入排序");
int[] copyArray = Arrays.copyOfRange(array, 0, array.length);
long statr = System.currentTimeMillis();
sortAll.insertionSort(copyArray);
long end = System.currentTimeMillis();
System.out.println("直接插入排序用時:" + (end - statr) + "ms");
System.out.println("========================================");
}
if (e.getActionCommand().equals("希爾排序")) {
System.out.println("下面是希爾排序");
int[] copyArray = Arrays.copyOfRange(array, 0, array.length);
long statr = System.currentTimeMillis();
sortAll.ShellSort(copyArray);
long end = System.currentTimeMillis();
System.out.println("希爾排序用時:" + (end - statr) + "ms");
System.out.println("========================================");
}
if (e.getActionCommand().equals("折半插入排序")) {
System.out.println("下面是折半插入");
int[] copyArray = Arrays.copyOfRange(array, 0, array.length);
long statr = System.currentTimeMillis();
sortAll.binaryInsertSort(copyArray);
long end = System.currentTimeMillis();
System.out.println("折半排序用時:" + (end - statr) + "ms");
System.out.println("========================================");
}
if (e.getActionCommand().equals("顯示排序結果")) {
PanelAll.showArea.setText("");
int[] copyArray = Arrays.copyOfRange(array, 0, array.length);
int[] sortF = sortAll.sortF(copyArray);
for (int i = 0; i < sortF.length; i++) {
PanelAll.showArea.append(String.valueOf(sortF[i]) + " ");
}
// PanelAll.jButton.setEnabled(false);
System.out.println("顯示完成!");
}
}
}
視窗事件
package 排序.test1;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JDialog;
public class MyWindowListener implements WindowListener {
private Menu menu;
public MyWindowListener(Menu menu2) {
// TODO Auto-generated constructor stub
menu = menu2;
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
System.out.println("歡迎來到這里!");
System.out.println("下面是排序綜合演算法的設計與實作的展示:");
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
close(this.menu);
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
public void close(Menu menu) {
JDialog jDialog = new JDialog(menu, "關閉", true);
jDialog.setSize(200, 200);
jDialog.setLocationRelativeTo(null);
jDialog.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 20));
jDialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
Button yButton = new Button("是");
Button nButton = new Button("否");
jDialog.add(yButton);
jDialog.add(nButton);
yButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("確定關閉!");
System.exit(0);
}
});
nButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
jDialog.setVisible(false);
jDialog.dispose();
System.out.println("誤操作!");
}
});
jDialog.setVisible(true);
}
}
五種排序
package 排序.test1;
public class SortAll {
/**
* 交換陣列內兩個元素
* @param array
* @param i
* @param j
*/
public static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
/*
* 冒泡排序
*/
public int[] bubbleSort(int[] array) {
// 如果為陣列為慷訓傳原陣列
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1 - i; j++)
// 找到大的值交換
if (array[j + 1] < array[j]) {
swap(array, j, j + 1);
}
Display(array);
}
return array;
}
/*
* 簡單選擇排序
*/
public int[] selectionSort(int[] array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) // 找到最小的數
minIndex = j; // 將最小數的索引保存
}
swap(array, minIndex, i);
Display(array);
}
return array;
}
/*
* 直接插入
*/
public int[] insertionSort(int[] array) {
if (array.length == 0)
return array;
int current;
for (int i = 0; i < array.length - 1; i++) {
// 記錄待排的數
current = array[i + 1];
int preIndex = i;
while (preIndex >= 0 && current < array[preIndex]) {
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = current;
Display(array);
}
return array;
}
/*
* 折半插入
*/
public int[] binaryInsertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
if (array[i] < array[i - 1]) {
// 快取i處的元素值
int tmp = array[i];
// 記錄搜索范圍的左邊界下標
int low = 0;
// 記錄搜索范圍的右邊界下標
int high = i - 1;
while (low <= high) {
// 記錄中間位置下標
int mid = (low + high) / 2;
// 比較中間位置資料和i處資料大小,以縮小搜索范圍
if (array[mid] < tmp) {
low = mid + 1;
} else {
high = mid - 1;
}
}
// 將low~i處資料整體向后移動1位
for (int j = i; j > low; j--) {
array[j] = array[j - 1];
}
// 將待排數插入
array[low] = tmp;
Display(array);
}
}
return array;
}
/*
* 希爾排序
*/
public int[] ShellSort(int[] array) {
int len = array.length;
int temp, gap = len / 2;// 步長每次減半
while (gap > 0) {
//從中間開始
for (int i = gap; i < len; i++) {
temp = array[i];
//記錄前一個步長位置
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
Display(array);
}
return array;
}
/*
* 顯示陣列
*/
public void Display(int[] array) {
int i = 0;
for (i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
public int[] sortF(int[] array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) // 找到最小的數
minIndex = j; // 將最小數的索引保存
}
swap(array, minIndex, i);
}
return array;
}
}
五、效果圖




總結
本次主要是針對本學期所學的簡單應用,主要涉及排序演算法、GUI圖形界面、字串的處理、以及一些常用類的呼叫,面向物件的思想是需要我們自己去體會理解的,在這里我想提醒大家,主動去練習,多動手才可以更好的理解,文章看起來很長,主要是加了很多源代碼,這也是我在查詢資料時有時遇到的問題,不愿去下載東西,所以就附原始碼,
如果想要打包好的,請在下方留言,
歡迎大家點贊評論!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/242377.html
標籤:java
