1. 程式人生 > 實用技巧 >小白懂演算法之插入排序

小白懂演算法之插入排序

前言

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

一.插入排序原理

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

二.圖解

三.實現思路

  插入排序分為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]+" ");
        }
    }

  測試結果:

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

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