Java編程練習Day09 --》數組排序與查詢01

南七丶 2022-01-08 06:11:52 阅读数:964

java day09 day 排序

Java編程練習Day09 --》數組排序與查詢

使用選擇排序法


實例說明

選擇排序是一種簡單直觀的排序算法。
本實例演示如何使用選擇排序法對一維數組進行排序,運行本實例,首先單擊生成隨機數按鈕,生成一個隨即數組,並顯示在上方的文本域控件中,然後單機選擇排序法按鈕,使用選擇排序法對生成的一維數組進行排序,並將排序後的一維數組顯示在下方的文本域控件中。

設計過程

選擇排序:
選擇排序的基本思想是,每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列後面,直到全部待排序的數據元素排完。

設計過程:
1.在項目中創建窗體類SelectSort類。在窗體中添加兩個文本域控件和生成隨機數,選擇排序法兩個按鈕控件。

2.編寫生成隨機數按鈕的事件處理方法,在該方法中創建Random隨機數對象,初始化數組元素值時,通過該對象為每個數組元素生成隨機數。

3.編寫選擇排序法按鈕的事件處理方法,在該方法中使用排序算法對生成的隨機數組進行排序,然後把排序後的數組元素顯示到文本域控件中。

測試代碼


import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class SelectSort extends JFrame {

//創建文本域
JTextArea textArea1;
JTextArea textArea2;
//創建按鈕
JButton sort;
JButton numRandom;
private int[] array = new int[10];
public SelectSort(){

textArea1 = new JTextArea(50,45);
textArea2 = new JTextArea(50,45);
sort = new JButton("選擇排序法");
numRandom = new JButton("生成隨機數");
//設置窗體標題
setTitle("選擇排序算法");
//設置窗體的比特置和大小
setBounds(250, 250, 490, 515);
//設置窗體的關閉方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//設置窗體可見
setVisible(true);
//設置窗體不可縮放
setResizable(false);
//設置布局方式為空布局
setLayout(null);
//設置各組件在窗口中的比特置和大小
textArea1.setBounds(20, 20, 400, 150);
numRandom.setBounds(185, 190, 120, 40);
textArea2.setBounds(20, 250, 400, 150);
sort.setBounds(185, 420, 120, 40);
//為按鈕添加事件監聽器
sort.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

textArea2.setText("");//清空文本域
int index;
for (int i = 1; i < array.length; i++) {

index = 0;
for (int j = 1; j <= array.length - i; j++) {

if(array[j] > array[index]){

index = j;
}
}
//交換在array.length - i 和 index (最大值) 比特置上的兩個數
int temp = array[array.length - i];
array[array.length - i] = array[index];
array[index] = temp;
}
for (int i = 0; i < array.length; i++) {

textArea2.append(array[i]+" ");
}
}
});
numRandom.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

Random random = new Random();//創建隨即數組對象
textArea1.setText("");//清空文本域
//初始化數組元素
for(int i = 0; i < array.length; i++){

array[i] = random.nextInt(50);//生成50以內的隨機數
textArea1.append(array[i]+" ");//把數組元素顯示到文本域控件中
}
}
});
//將各組件添加到窗口中去
add(textArea1);
add(textArea2);
add(sort);
add(numRandom);
}
public static void main(String[] args) {

new SelectSort();
}
}

運行結果

在這裏插入圖片描述

使用冒泡排序


實例說明

本實例演示如何使用冒泡排序法,對一維數組進行排序。運行本實例,首先單擊生成隨機數按鈕,生成一個隨機數組並顯示在上方的文本域控件中;然後單擊冒泡排序按鈕,使用冒泡排序法對生成的一維數組進行排序,並將排序過程中一維數組的變化顯示在下方的文本域控件中。

設計過程

冒泡排序:
冒泡排序的基本思想是對比相鄰的元素值,如果滿足條件就交換元素值,把較小的元素移動到數組前面,把大的元素移動到數組後面(也就是交換兩個元素的比特置),這樣數組元素就像氣泡一樣從底部上昇到頂部。

冒泡算法在雙層循環中實現,其中外層控制排序輪數,要排序數組長度-1次,而內層循環主要是用於對比臨近元素的大小,以確定是否交換比特置,對比和交換次數隨排序輪數而减少。

設計過程:
1.在項目中創建窗體類BubbleSort。在窗體中添加兩個文本域控件和生成隨機數,冒泡排序法兩個按鈕。

2.編寫生成隨機數按鈕的事件處理方法,在該方法中使用排序算法對生成的隨機數組進行排序,然後把排序後的數組元素顯示到文本域控件中。

3.編寫冒泡排序法按鈕的事件處理方法,在該方法中使用排序算法對生成的隨機數組進行排序,然後把排序後的數組元素顯示到文本域控件中。

測試代碼


import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class BubbleSort extends JFrame {

//創建文本域
JTextArea textArea1;
JTextArea textArea2;
//創建按鈕
JButton sort;
JButton numRandom;
private int[] array = new int[10];
public BubbleSort(){

textArea1 = new JTextArea(50,45);
textArea2 = new JTextArea(50,45);
sort = new JButton("冒泡排序法");
numRandom = new JButton("生成隨機數");
//設置窗體標題
setTitle("冒泡排序算法");
//設置窗體的比特置和大小
setBounds(250, 250, 490, 515);
//設置窗體的關閉方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//設置窗體可見
setVisible(true);
//設置窗體不可縮放
setResizable(false);
//設置布局方式為空布局
setLayout(null);
//設置各組件在窗口中的比特置和大小
textArea1.setBounds(20, 20, 400, 50);
numRandom.setBounds(175, 75, 120, 40);
textArea2.setBounds(20, 125, 400, 250);
sort.setBounds(175, 408, 120, 40);
//為按鈕添加事件監聽器
sort.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

textArea2.setText("");//清空文本域
int index;
for (int i = 1; i < array.length; i++) {

//比較相鄰的兩個元素,較大的往後冒泡
for (int j = 0; j < array.length - i; j++) {

if (array[j] > array[j + 1]) {

int temp = array[j];//把第一個元素值保存到臨時變量中
array[j] = array[j + 1];//把第二個元素值保存到第一個元素單元中
array[j + 1] = temp;//把臨時變量也就是第一個元素原值保存到第二個元素中
}
textArea2.append(array[j]+" ");//把排序後的數組元素顯示到文本域中
}
textArea2.append("【");
for (int j = array.length - i; j < array.length; j++) {

textArea2.append(array[j]+" ");//把排序後的數組元素顯示到文本域中
}
textArea2.append("】\n");
}
}
});
numRandom.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

Random random = new Random();//創建隨即數組對象
textArea1.setText("");//清空文本域
//初始化數組元素
for(int i = 0; i < array.length; i++){

array[i] = random.nextInt(50);//生成50以內的隨機數
textArea1.append(array[i]+" ");//把數組元素顯示到文本域控件中
}
}
});
//將各組件添加到窗口中去
add(textArea1);
add(textArea2);
add(sort);
add(numRandom);
}
public static void main(String[] args) {

new BubbleSort();
}
}

運行結果

在這裏插入圖片描述

使用快速排序法


實例說明

快速排序是對起泡排序的一種改進,其排序速度相對較快。本實例演示如何使用快速排序法對一維數組進行排序,運行本實例首先單擊生成隨即數組按鈕生成一個隨即數組,並顯示在上方的文本框中;然後單擊快速排序法按鈕,使用快速排序法對生成的一維數組進行排序,並將排序後的一維數組顯示在下方的文本框中。

設計過程

快速排序的基本思想:
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據比另一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此使整個數據變成有序序列。

設計過程:
1.在項目中創建窗體類QuickSort。在窗體中添加一個文本框,一個文本域控件和生成隨機數,快速排序法兩個按鈕。

2.編寫快速排序法按鈕的事件處理方法,在該方法中利用快速排序算法對生成的隨即數組進行排序,並將排序過程輸出到文本域控件中。

3.編寫快速排序方法quickSort(),這個方法將被按鈕的事件處理方法調用,該方法在實現快速排序的同時,把排序過程顯示到文本域控件中。

4.由於快速排序方法中頻繁的交換數組元素,而且在程序代碼中出現的比特置較多,所以應該把數組元素交換單獨提煉為一個swap()方法,以實現代碼重用並且可以在該方法中唱我排序過程並顯示到文本域控件中。

測試代碼


import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class QuickSort extends JFrame {

//創建文本域
JTextArea textArea1;
JTextArea textArea2;
//創建按鈕
JButton sort;
JButton numRandom;
//創建滾動面板
JScrollPane jsp;
private int[] array = new int[10];
public QuickSort(){

textArea1 = new JTextArea(50,45);
textArea2 = new JTextArea(50,45);
sort = new JButton("快速排序算法");
numRandom = new JButton("生成隨機數");
jsp = new JScrollPane(textArea2);
//設置窗體標題
setTitle("快速排序算法");
//設置窗體的比特置和大小
setBounds(250, 250, 490, 515);
//設置窗體的關閉方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//設置窗體可見
setVisible(true);
//設置窗體不可縮放
setResizable(false);
//設置布局方式為空布局
setLayout(null);
//設置各組件在窗口中的比特置和大小
textArea1.setBounds(20, 20, 400, 50);
numRandom.setBounds(175, 75, 120, 40);
jsp.setBounds(20, 125, 400, 250);
sort.setBounds(175, 408, 120, 40);
//為按鈕添加事件監聽器
sort.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

textArea2.setText("");//清空文本域
quickSort(array, 0, array.length - 1);
}
});
numRandom.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

Random random = new Random();//創建隨即數組對象
textArea1.setText("");//清空文本域
//初始化數組元素
for(int i = 0; i < array.length; i++){

array[i] = random.nextInt(50);//生成50以內的隨機數
textArea1.append(array[i]+" ");//把數組元素顯示到文本域控件中
}
}
});
//將各組件添加到窗口中去
add(textArea1);
add(jsp);
add(sort);
add(numRandom);
}
private void quickSort(int sortArray[],int lowIndex,int highIndex){

int lo = lowIndex;//記錄最小索引
int hi = highIndex;//記錄最大索引
int mid;//記錄分界點元素
if(highIndex > lowIndex){

mid = sortArray[(highIndex + lowIndex)/2];//確定中間分界點元素值
while(lo <= hi){

while((lo < highIndex) && (sortArray[lo] < mid))
++lo; //確定不大於分解元素值的最小索引
while((hi > lowIndex) && (sortArray[hi] > mid))
--hi; //確定不大於分解元素值的最小索引、
if(lo <= hi){
//如果最小與最大索引沒有重疊
swap(sortArray,lo,hi);//交換兩個索引的元素
++lo;//遞增最小索引
--hi;//遞增最大索引
}
}
if(lowIndex < hi)
quickSort(sortArray, lowIndex, hi);//遞歸排序沒有未分解元素
if(lo < highIndex)
quickSort(sortArray, lo, highIndex);//遞歸排序沒有未分解元素
}
}
private void swap(int swapArray[],int i,int j){

int temp = swapArray[i];//交換數組元素
swapArray[i] = swapArray[j];
swapArray[j] = temp;
for (int k = 0; k < array.length; k++) {

textArea2.append(array[k]+" ");
}
textArea2.append("\n");//追加換行符
}
public static void main(String[] args) {

new QuickSort();
}
}

運行結果

在這裏插入圖片描述

版权声明:本文为[南七丶]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080611520581.html