演算法導論學習之一:氣泡排序

趙明威發表於2014-09-14

氣泡排序:

由於氣泡排序是大家必學必會,而且是應用廣泛的下面介紹一下基本原理 氣泡排序動態圖形原理--取自百度圖片

enter image description here

氣泡排序(Bubble Sort)是一種簡單的排序演算法。

它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

氣泡排序演算法的運作如下:

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 針對所有的元素重複以上的步驟,除了最後一個。 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

本例從後面向前面上浮冒泡

package class2;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] A=new int[]{2,4,1,3,6,0,3,5};
        System.out.println(Arrays.toString(A));
        bubblesort(A);
        System.out.println(Arrays.toString(A));
    }
    public static void bubblesort(int[] A) {
        int temp=0;
        for (int i = 0; i < A.length-1; i++) {   //最多做n-1趟排序
            System.out.println("第"+(i+1)+"輪");
            for (int j = A.length-1; j>i; j--) {
                if (A[j]<A[j-1]) {
                    temp=A[j];
                    A[j]=A[j-1];
                    A[j-1]=temp;
                }
                System.out.println(Arrays.toString(A));
            }
        }
    }
}
Result:
[2, 4, 1, 3, 6, 0, 3, 5]
第1輪
[2, 4, 1, 3, 6, 0, 3, 5]
[2, 4, 1, 3, 6, 0, 3, 5]
[2, 4, 1, 3, 0, 6, 3, 5]
[2, 4, 1, 0, 3, 6, 3, 5]
[2, 4, 0, 1, 3, 6, 3, 5]
[2, 0, 4, 1, 3, 6, 3, 5]
[0, 2, 4, 1, 3, 6, 3, 5]
第2輪
[0, 2, 4, 1, 3, 6, 3, 5]
[0, 2, 4, 1, 3, 3, 6, 5]
[0, 2, 4, 1, 3, 3, 6, 5]
[0, 2, 4, 1, 3, 3, 6, 5]
[0, 2, 1, 4, 3, 3, 6, 5]
[0, 1, 2, 4, 3, 3, 6, 5]
第3輪
[0, 1, 2, 4, 3, 3, 5, 6]
[0, 1, 2, 4, 3, 3, 5, 6]
[0, 1, 2, 4, 3, 3, 5, 6]
[0, 1, 2, 3, 4, 3, 5, 6]
[0, 1, 2, 3, 4, 3, 5, 6]
第4輪
[0, 1, 2, 3, 4, 3, 5, 6]
[0, 1, 2, 3, 4, 3, 5, 6]
[0, 1, 2, 3, 3, 4, 5, 6]
[0, 1, 2, 3, 3, 4, 5, 6]
第5輪
[0, 1, 2, 3, 3, 4, 5, 6]
[0, 1, 2, 3, 3, 4, 5, 6]
[0, 1, 2, 3, 3, 4, 5, 6]
第6輪
[0, 1, 2, 3, 3, 4, 5, 6]
[0, 1, 2, 3, 3, 4, 5, 6]
第7輪
[0, 1, 2, 3, 3, 4, 5, 6]
[0, 1, 2, 3, 3, 4, 5, 6]

第三章函式的增長

漸近緊確界

斐波那契數列:

enter image description here

遞迴法,效率上來講,沒有直接法快

package class2;

public class feibonaqiArray {
    public static void main(String[] args) {
        System.out.println(arr(8));
    }
    public static long arr(int n) {
        if (n<=1) {
            return 1;
        }else if(n==2){
            return 1;
        }
        else {
            return arr(n-1)+arr(n-2);
        }
    }
}
========================================================

直接法:

        package class2;

public class fibonaqiArray_2 {
    public static void main(String[] args) {
        long a=1,b=1;
        long temp;
        long n=50;
        long t1 = System.nanoTime();
        for (int i = 0; i < n-2; i++) {
            temp=b;
            b=a+b;
            a=temp;
        }
        long t2 = System.nanoTime();
        System.out.println(b);
        System.out.println(t2-t1);
    }
}

相關文章