1. 程式人生 > >八大排序演算法 —— 氣泡排序

八大排序演算法 —— 氣泡排序

氣泡排序

核心思想:將臨近的兩個元素互相比較,將大的元素放在後面,依次迴圈下去,第一趟完成比較後,最大的元素會排在最後,第二趟後第二大的元素會排在倒數第二位,n-1趟後元素全部被排完。

排序過程:
從小到大排序,原始待排序陣列| 6 | 2 | 4 | 1 | 5 | 9 |
第一趟排序(外迴圈)

第一次兩兩比較6 > 2交換(內迴圈)

交換前狀態| 6 | 2 | 4 | 1 | 5 | 9 |
交換後狀態| 2 | 6 | 4 | 1 | 5 | 9 |

第二次兩兩比較,6 > 4交換

交換前狀態| 2 | 6 | 4 | 1 | 5 | 9 |
交換後狀態| 2 | 4 | 6 | 1 | 5 | 9 |

第三次兩兩比較,6 > 1交換

交換前狀態| 2 | 4 | 6 | 1 | 5 | 9 |
交換後狀態| 2 | 4 | 1 | 6 | 5 | 9 |

第四次兩兩比較,6 > 5交換

交換前狀態| 2 | 4 | 1 | 6 | 5 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

第五次兩兩比較,6 < 9不交換

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

第二趟排序(外迴圈)

第一次兩兩比較2 < 4不交換
交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

第二次兩兩比較,4 > 1交換

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

第三次兩兩比較,4 < 5不交換

交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

第四次兩兩比較,5 < 6不交換

交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

第三趟排序(外迴圈)

第一次兩兩比較2 > 1交換
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

第二次兩兩比較,2 < 4不交換

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

第三次兩兩比較,4 < 5不交換

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

第四趟排序(外迴圈)無交換

第五趟排序(外迴圈)無交換

排序完畢,輸出最終結果1 2 4 5 6 9

氣泡排序的時間複雜度是O(n2),空間複雜度是O(1),氣泡排序還是一種穩定的排序方法。(因為只和鄰近的元素比較,所以排序後不會出現相同大小的不同元素位置顛倒的可能性)

演算法實現的程式碼:


import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int []data  = new int[8];
        for(int i= 0;i<data.length ;i++){
            data[i] = sc.nextInt();
        }

        //氣泡排序
        bubbleSort(data);

        for(int i = 0;i<data.length ;i++){
            System.out.print(data[i]+" ");
        }

    }
//氣泡排序
    public static int[] bubbleSort(int [] data){
        for(int i = data.length-1;i>=0;i--){
            for(int j= 0;j<i;j++){
                if(data[j] > data[j+1]){
                    int tmp = data[j];
                    data[j] = data[j+1];
                    data[j+1] = tmp;
                }
            }
        }
        return data;
    }
}