1. 程式人生 > >插入排序(Java實現)

插入排序(Java實現)

維基百科的定義:

        插入排序英語:Insertion Sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到{\displaystyle O(1)}{\displaystyle O(1)}的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

演算法描述:

       (升序為例)從第二個元素開始,第一個元素可以被認為已排序的,取出第二個元素,如果大於第一個元素,則交換他們的位置(相當於插入到第一個元素之前),接著取出第三個元素,與第二個元素比較,較大者交換位置,直到找到前一個元素小於或等於新元素的位置為止,依次類推,最終形成升序排序陣列

時間複雜度:

 O(N^2)

空間複雜度:

  O(1)

Java程式碼:

public class insertionSort {

    public static void insertionSort(int[] arr){
        if(arr == null || arr.length < 2){
            return;
        }
        for (int i = 1; i < arr.length; i++) {//從index=1開始,i++好比挨個插入到陣列末尾
            for (int j = i-1; j >=0 && arr[j] > arr[j+1]; j--){//此迴圈表示從右往左兩兩比較
                swap(arr,j,j+1);
            }

        }
    }
    //交換
    private static void swap(int[] arr, int a, int b) {
        arr[a] = arr[a] ^ arr[b];
        arr[b] = arr[a] ^ arr[b];
        arr[a] = arr[a] ^ arr[b];
    }
    public static void main(String[] args) {
        int[] arr = new int[]{8,3,6,0,5,3,3,4};
        insertionSort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");//0  3  3  3  4  5  6  8
        }
    }
}

過程簡圖


優缺點:

        插入排序所需的時間取決於輸入中元素的初始順序,對於一個很大且其中的元素已經有序或者部分有序的陣列進行排序將會比對隨機順序的陣列或者逆序的陣列進行排序要快很多。