1. 程式人生 > >新手必看——JAVA排序詳解(氣泡排序和插入排序)

新手必看——JAVA排序詳解(氣泡排序和插入排序)

對於排序,它一直不厭其煩的出現在企業面試初級工程師的筆試題中,不管是氣泡排序還是插入排序,我們經常會在在初級面試題中遇見,就好像它已成為一種面試的標準。而對於程式設計師來說,基本排序就真的這麼重要嗎?當然不,作為一個老司機的我們已經知道,對於新手很心累的各種這兩種排序,其實只要一個簡單的Arrays.sort()方法就可完成,也就是我們常說的快速排序,那為何還要對新手有這兩種排序演算法的要求?
首先,排序方法當然不止這兩種,但是對於新手來說,冒泡和插入不止是一種演算法,而是一種思想。也是對巢狀迴圈的一種運用,所以對於新手來說,排序就變成了一種必備的要求。

—– 氣泡排序 —–
氣泡排序的原理:將陣列中的第1個數跟第2個數相比較,哪個數大,哪個存在後面。什麼意思呢,如果arr[0]>arr[1],則將兩個數調換位置(相信交換數值的例子大家都會做),如下:

    if(arr[0]>arr[1]){//這樣就把兩個數中較大的數存在了後面的位置
        int k=arr[0];
        arr[0]=arr[1];
        arr[1]=k;
    }

比較完以後,再拿第2個數與第3個數比較,再將較大的數存在後面的位置,直到比完最後一個數為止,經過這一輪比較你會發現,陣列中的最後一個數就是最大數,如下:

    int [] arr=new int[]{15,20,36,12,45,9};
    for(int i=0;i<arr.length-1;i++){
        if(arr[i]>arr[i+1
]){ int k=arr[i]; arr[i]=arr[i+1]; arr[i+1]=k; } } System.out.println(arr[arr.length-1]);//陣列最後一個元素是最大值 45

這時候我們找到了陣列的最大值並且經過交換把它存在了陣列最後一個位置,我們只需要用同樣的方法把剩餘的數比較一遍(迴圈),然後再存在剩餘位置的最後一個位置即可(每過一輪能找到一個剩餘數中的最大數並存在剩餘的最靠後位置),所以我們第二次比較只需要比較arr.length-1-1次,同樣第三次只需要比較arr.length-1-2次,如下:

    int [] arr=new int[]{15,20,36,12,45,9};
    for(int j=0;j<arr.length;j++){
        for(int i=0;i<arr.length-1-j;i++){//每次迴圈冒出一個較大數,然後其餘數再比較
            if(arr[i]>arr[i+1]){//交換元素
                int k=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=k;
            }
        }
    }
    System.out.println(arr[arr.length-1]);//陣列最後一個元素是最大值  45
    System.out.println(Arrays.toString(arr));//[9, 12, 15, 20, 36, 45]

—– 插入排序 —–
插入排序原理:將陣列中的每一個元素與第一個元素相比較!如果這個元素小於第一個元素,則交換這兩個元素,然後迴圈這條規則。
如圖:
取出要插入的數,與前面的數一一比較,找到插入位置然後插入,其他的數依次向後移動
從圖中可以看到,我們可以把過程理解為將從陣列第二個數開始(先把這個數定為要插入的數)依次與前面的數相比較,如果後面的數小,則交換位置,直到換到不必它前面的數小為止(就將要插入的數付給最後依次比數的位置)

    int [] arrs=new int[]{5,2,4,6,1,3};
         for (int i=1; i<arrs.length;i++) {
                int k=arrs[i];//取出待插入元素
                int j;//作為插入位置
                for (j=i-1; j>=0&&k<arrs[j];j--) {//將這個數與它前面的數一一比較
                    arrs[j+1]=arrs[j];//若這個數小,則把它前面的數向後移動
                }
                arrs[j+1]=k;//最後找到插入位置,如上圖,3跟6 5 4 2 最後插入到原來4的位置
            }
         System.out.println(Arrays.toString(arrs));
        }
不管是哪種排序方法,原理都是差不多,主要看思路和能不能掌握,畢竟以後寫程式碼的話可能會碰到類似演算法的問題,要學會舉一反三。希望對你們有用~