1. 程式人生 > 實用技巧 >演算法排序的思想

演算法排序的思想

先放一段氣泡排序的程式碼

public class Test {
    public void bubbleSort(int[] a){
        if (a.length<=1){return;}
        for (int i = 0; i < a.length; i++) {
            boolean flag = false;
            for (int j = 0; j < a.length - i - 1; j++) {
                int tmp = a[j];
                if (a[j]>a[j+1
]){ a[j]=a[j+1]; a[j+1] = tmp; flag = true; } } if (flag==false){ return; } } } public static void main(String[] args) { int[] q = {10,20,3,2,4,6,7,5}; Test test = new Test(); test.bubbleSort(q); System.out.println(Arrays.toString(q)); } }

for (int i = 0; i < a.length; i++)這個迴圈體主要是保證陣列中的每一個數據都能得到一次修正的機會。for (int j = 0; j < a.length - i - 1; j++)這一個迴圈體則是每一個元素進行比較做的,j+1和這邊的i-a.length-1是相互對應的,因為在比較的時候,比較到n-1個元素的時候就可以停止了,這樣也不會有越界的可能性。

這種寫法保證的是每一次遍歷,在尾部的一定是最大的。還有一種是保證尾部最小的實現。只需要(a[j]>a[j+1])中條件相反就可以做到。

其實氣泡排序的特點就是:不需要額外的空間,只需要一個區域性變數來暫存下值就可以。另外一方面的特點就是最優情況下時間複雜度為O(n),最差情況下是O(!n/n)=O(n²),平均下來是O(n²),空間複雜度是O(1)。

另外它是一個穩定的演算法,在滿足條件的情況下是不會去進行無效換位的。也就是在“同一時間訂單,金額大的優先排序”這種型別的需求可以完美的滿足它。

氣泡排序在我的思維裡面是一個比較基礎的演算法,特點很明顯就是程式碼很通俗易懂,加上哨兵位來提前退出之後也可以節約無效的計算。

氣泡排序的精髓就是這個動圖了。一個元素為基準的確定性,通過雙重迴圈保證後面的無效比較不被髮生。