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

Java實現插入排序(三)

原理:每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。

思想:想必你肯定打過撲克牌吧,在一張一張揭牌的時候,是不是每次揭一張牌將其插入到其他已經有序的牌中的適當位置,如果你沒有這個經歷,趕緊約一波小夥伴,鬥一把。與選擇排序一樣,把要排序的資料分為已排序區間和未排序序列。初始已排序區間只有一個元素,就是陣列的第一個元素,然後取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空。

插入排序有一個關鍵的點,就是在上圖中第四行,當要把3插入到有序序列中的時候,會涉及到移動4,5,6

這三個數的操作,插入三需要移動三個數,即4,5,6 ,這樣的順序稱為倒置,即逆序,意思是這兩個數的順序是顛倒的。只有移動完這些與插入元素倒序的數之後,要插入的元素才有位置,在整個插入排序過程中,移動次數等於陣列中逆序對的個數,即逆序度,為什麼呢,看下圖:

/**
 * @program: JavaSpecialityDeep
 * @author: Mr.Zerah
 * @create: 2018-10-26 00:45
 * @description: 插入排序
 **/
public class InsertionSort {
    public  void insertSort(Comparable[] arr,int N){
        //將arr[]按升序排列
        for (int i = 1; i < N; i++) {
            //將a[i]插入到a[i-1],a[i-2],a[i-3] 之中
            for (int j = i; j >0 && SortUtil.less(arr[j],arr[j-1] ); j--) {
                SortUtil.exchange(arr, j, j-1);
            }
        }
    }
}

時間複雜度:

如果陣列已經是有序的,不需要移動任何資料,因此最好的時間複雜度為O(n);

如果陣列是倒敘的,每次插入元素相當於在陣列的第一個位置插入新的資料,因此需要大量移動資料,所以時間複雜度為O(n2)。

所以平均時間複雜度為:O(n2)。

參考:《演算法4》