小白懂演算法之插入排序

愛程式設計DE文兄發表於2020-11-14

前言

  真的,看到挺多部落格的插入排序,思路大多都是對的,但是在程式碼實現上不嚴謹,甚至還有的跟氣泡排序搞混了,還是有必要分析波插入排序,希望能幫助到大家。

一.插入排序原理

    插入排序原理是:逐步構建有序的序列,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

二.圖解

三.實現思路

  插入排序分為3種情況:

    1.當前節點<前面的A節點時,A節點後移一位,接著向前繼續比較。
    2.當前節點>前面的A節點時,當前節點插入到A節點的後一個位置,此時不需要再繼續比較了,因為A節點及之前的元素已經是有序的了
    3.當前節點<前面的A節點時,並且A節點的位置是0時,需要連續兩步操作:A節點往後移一位,當前節點插入到陣列下標為0的位置。

  如果這個思路看不懂沒關係,請看程式碼,有更詳細的解釋。

四.程式碼實現

  語言採用Java來實現,如果看不懂java程式碼關係也不大,基本每行都有解釋

    /**
     *     實現思路:
     *         插入排序需要考慮3種情況:
     *             1.當前節點<前面的A節點時,A節點後移一位,接著繼續比較
     *             2.當前節點>前面的A節點時,當前節點插入到A節點的後一個位置,此時不需要再繼續比較了,因為A節點及之前的元素已經是有序的了
     *             3.當前節點<前面的A節點時,並且A節點的位置是0時,需要連續兩步操作:A節點往後移一位,當前節點插入到陣列下標為0的位置
     * 
     */
    public static int[] InsertionSortByFor(int[] arr) {
        
        /**
         *     最多遍歷arr.length-1輪,i的值表示每輪從哪個位置開始向前比較;
         *     比如arr[1],那麼arr[1]就和arr[0]進行比較
         *     arr[2],從arr[2]向前掃描比較
         *     arr[3],從arr[3]向前掃描比較
         *     依次類推
         */
        for(int i=1;i<arr.length;i++) {    
            int temp = arr[i];        //temp是儲存著每輪當前節點的值,儲存的目的是用於與前面的值做比較
            for(int j=i-1;j>=0;j--) {    //j的值記錄的是當前節點的前面元素的下標位置;
                                        //只要滿足j>=0,元素的比較才能進行,若j<0就會超出陣列下標的範圍
                                        //j--才能比較前面的元素
                if(temp<=arr[j]) {    //當前節點<前面的A元素,那麼A元素往後移
                    arr[j+1] = arr[j];
                    if(j==0) {    //這裡屬於特殊情況,當temp<=arr[j]以及j==0時,需要連續兩步操作:1.A元素往後移 2.當前節點插入到arr[0]的位置
                        arr[j] = temp;
                    }
                }else{    //當前節點>前面的A元素,那當前節點插入到A元素的後面,即j+1的位置
                    arr[j+1] = temp;
                    break;    //break是到這一步就不需要再往前比較了,因為A元素及之前的元素已經是有序了
                }
            }
            
        }
        return arr;
    }

  main方法測試:

    public static void main(String[] args) {
        //建立一個無序陣列
        int[] arr = new int[] {3,6,1,87,90,34,34,25};
        //呼叫插入排序方法,返回一個排序後的陣列
        int[] sortedArr = InsertionSortByFor(arr);
        //遍歷陣列
        for(int i=0;i<sortedArr.length;i++) {
            System.out.print(sortedArr[i]+" ");
        }
    }

  測試結果:

  其實說得挺詳細的了,基本都有註釋,如果有不懂歡迎大家下面留言,上面的程式碼其實還有優化的空間,只不過臨時寫的,一些細節可能處理不到位請見諒

  可以的話給個推薦,讓我知道你來過!

相關文章