Java實現插入排序(三)
阿新 • • 發佈:2018-12-18
原理:每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。
思想:想必你肯定打過撲克牌吧,在一張一張揭牌的時候,是不是每次揭一張牌將其插入到其他已經有序的牌中的適當位置,如果你沒有這個經歷,趕緊約一波小夥伴,鬥一把。與選擇排序一樣,把要排序的資料分為已排序區間和未排序序列。初始已排序區間只有一個元素,就是陣列的第一個元素,然後取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空。
插入排序有一個關鍵的點,就是在上圖中第四行,當要把3插入到有序序列中的時候,會涉及到移動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》