一、排序算法導圖
二.算法實現
冒泡排序
1.算法簡介:
- 冒泡排序是所有排序算法中最簡單、最基本的一種。冒泡排序法的思路就是交換排序,通過相鄰數據的交換來達到排序的目的。
2.排序流程:
- 對數組的各個數據,依次比較相鄰的元素的大小;
- 如果前面的數大於後面的數,就交換這兩個數據,經過第一輪的多次比較後,便可把最小的數據排好;
- 再用同樣的方法把剩下的數據逐個進行比較,最後便可以按照從小到大的順序排好數組各數據的順序。
3.優劣分析
- 冒泡排序在對N個數據進行排序時,無論原數據有多無序,都需要進行N-1 步的中間排序。
- 冒泡排序算法思路簡單,但是缺點就是執行步驟有點長,效率不高。
4.算法優化:
- 在每次中間排序後,比較一下數據是否已經按照順序排列完成。如果已經完成則退出排序,否則繼續冒泡排序。對於數據較規律的可以加快排序速度。
5.代碼演示:
import java.util.Scanner;
public class BubbleSort {
static final int MAXLEN = 20; //指定數組的最大長度
public static void main(String[] args) {
int[] waitSort = new int[MAXLEN];
Scanner input = new Scanner(System.in);
System.out.println("冒泡排序算法演示");
System.out.println("請輸入待排序數據的個數(<20):");
int num = input.nextInt();
System.out.println("請輸入待排序數據:");
for (int i = 0; i < num; i++) {
waitSort[i] = input.nextInt();
}
sortArr(waitSort, num); //調用冒泡排序算法進行排序
System.out.print("最終排序結果爲:");
for (int i = 0; i < num; i++) { //打印排序後的結果
System.out.print(+waitSort[i] + " ");
}
}
//冒泡排序 參數一:待排序數組 參數二:元素的個數
private static void sortArr(int[] waitSort, int num) {
int temp;
int start; //起始位置
int end = num - 1; //結束的位置
for (int i = 0; i < end; i++) { //總遍歷輪數 = num - 1 次
start = -1;
for (int j = 0; j < end - i; j++) { //每輪比較次數 = 比前一輪少一次
start = start + 1;
if (waitSort[start] > waitSort[start + 1]) { //如果前一個數大於後一個數
temp = waitSort[start + 1];
waitSort[start + 1] = waitSort[start]; //交換他們的位置
waitSort[start] = temp;
}
}
System.out.print("第" + (i + 1) + "輪排序的結果:");
for (int k = 0; k < num; k++) {
System.out.print(waitSort[k] + " ");
}
System.out.println();
}
}
}
選擇排序
1.算法簡介:
- 選擇排序也是比較簡單的排序算法,思路比較直觀。選擇排序在每一步中選取最小值來重新排列,從而達到排序目的。
2.排序流程:
- 首先從原始數組中選擇最小的1個數據,將其和位於第一位置的數據交換;
- 接着從剩下的n-1個數據中選擇次小的1個數據,將其和第二個位置的數據交換;
- 然後,這樣不斷重複,直到最後兩個數據完成交換。至此,就完成了對原始數組的排序。
3.算法優劣:
- 選擇排序算法在對N個數據進行排序時,無論原數據有無順序,都需要進行N-1步的中間排序。思路簡單,但執行步驟較長,效率不高。
4.代碼演示:
import java.util.Scanner;
public class SelectSort {
static final int MAXLEN = 20; //指定數組的最大長度
public static void main(String[] args) {
int[] waitSort = new int[MAXLEN];
Scanner input = new Scanner(System.in);
System.out.println("選擇排序算法演示");
System.out.println("請輸入待排序數據的個數(<20):");
int num = input.nextInt();
System.out.println("請輸入待排序數據:");
for (int i = 0; i < num; i++) {
waitSort[i] = input.nextInt();
}
sortArr(waitSort, num); //調用選擇排序算法進行排序
System.out.print("最終排序結果爲:");
for (int i = 0; i < num; i++) { //打印排序後的結果
System.out.print(+waitSort[i] + " ");
}
}
//選擇排序 參數一:待排序的數據 參數二:數據的個數
private static void sortArr(int[] waitSort, int num) {
int min; //每輪最小數據
for (int i = 0; i < num - 1; i++) { //找出每一輪中最小的數據
for (int j = 1; j < num - i; j++) { //找出當前輪中最小的數
if (waitSort[i] > waitSort[i + j]) { //如果後面的數據中比當前比較的數字小,則交換
min = waitSort[i + j];
waitSort[i + j] = waitSort[i];
waitSort[i] = min;
}
System.out.print("內" + j + "輪數據爲");
for (int k = 0; k < num; k++) {
System.out.print(waitSort[k] + " ");
}
System.out.println();
}
}
}
}
插入排序
1.算法簡介:
- 插入排序通過對未排序的數據執行逐個插入至合適的位置而完成排序工作。算法思路簡單,使用較多,類似於打牌時整理牌。
2.排序流程:
- 首先對數組的前兩個數據進行從小到大的排序;
- 接着將第3個數據與排好序的兩個數據進行比較,將第3個插入到合適的位置;
- 然後,將第4個數據插入到已排好序的前三個數據中。
- 不斷重複上述過程,直到把最後一個數據插入到合適的位置。31
3.算法優劣:
- 選擇排序算法在對N個數據進行排序時,無論原數據有無順序,都需要進行N-1步的中間排序。思路簡單,在數據已有一定順序的情況下,排序效果較好。但數據無規則時,需要移動大量數據,效果也就變差了。
4.代碼演示:
import java.util.Scanner;
public class InsertSort {
static final int MAXLEN = 20; //指定數組的最大長度
public static void main(String[] args) {
int[] waitSort = new int[MAXLEN];
Scanner input = new Scanner(System.in);
System.out.println("插入排序算法演示");
System.out.println("請輸入待排序數據的個數(<20):");
int num = input.nextInt();
System.out.println("請輸入待排序數據:");
for (int i = 0; i < num; i++) {
waitSort[i] = input.nextInt();
}
sortArr(waitSort, num); //調用插入排序算法進行排序
System.out.print("最終排序結果爲:");
for (int i = 0; i < num; i++) { //打印排序後的結果
System.out.print(+waitSort[i] + " ");
}
}
//插入排序 參數一:待排序數組 參數二:元素的個數
private static void sortArr(int[] waitSort, int num) {
int start = 0;
int end = 1;
int temp, newTemp;
if (waitSort[start] > waitSort[end]) { //1.對前兩個數據進行處理,如果前一個數>後一個數 則交換位置
temp = waitSort[end];
waitSort[end] = waitSort[start];
waitSort[start] = temp;
}
do {
//2.下一個值去和頭尾進行比較
if (waitSort[end + 1] <= waitSort[start]) { //如果比最小的數都小,則換位置到最前面
temp = waitSort[end + 1];
for (int i = end + 1; i > 0; i--) {
waitSort[i] = waitSort[i - 1];
}
waitSort[0] = temp;
end++;
} else if (waitSort[end + 1] >= waitSort[end]) { //如果比當前最大的都大,將end加1
end++;
} else { //其他情況的處理
int i = 1;
while (waitSort[end + 1] > waitSort[start + i]) { //計算出要插入的位置索引
i++;
}
newTemp = waitSort[end + 1]; //保存最新的數據
for (int j = end + 1; j > i; j--) { //從插入位置整體後移
temp = waitSort[start + j]; //保存當前狀態
waitSort[j] = waitSort[j - 1];
}
waitSort[start + i] = newTemp; //插入數據
end++;
}
System.out.print("該輪排序後結果爲:");
for (int j = 0; j < num; j++) {
System.out.print(waitSort[j] + " ");
}
System.out.println();
} while (end < num - 1);
}
}