排序思路:每次將一個待排序的元素與已排序的元素進行逐一比較,直到找到合適的位置按大小插入。算法
第一趟比較示圖:spa
算法實現:code
public static void insertsort(int arr[]){ for(int i = 1;i < arr.length; i ++){ if(arr[i] < arr[i-1]){//注意[0,i-1]都是有序的。若是待插入元素比arr[i-1]還大則無需再與[i-1]前面的元素進行比較了,反之則進入if語句 int temp = arr[i]; int j; for(j = i-1; j >= 0 && arr[j] > temp; j --){ arr[j+1] = arr[j];//把比temp大或相等的元素所有日後移動一個位置 } arr[j+1] = temp;//把待排序的元素temp插入騰出位置的(j+1) } } } public static void main(String[] args) { int array[] = {4,2,1,5}; System.out.println("排序以前:"); for(int element : array){ System.out.print(element+" "); } insertsort(array); System.out.println("\n排序以後:"); for(int element : array){ System.out.print(element+" "); } } }
結果:blog
排序以前: 4 2 1 5 排序以後: 1 2 4 5
算法分析:1.當元素的初始序列爲正序時,僅外循環要進行n-1趟排序且每一趟只進行一次比較,沒有進入if語句不存在元素之間的交換(移動)。此時比較次數(Cmin)和移動次數(Mmin)達到 最小值。排序
Cmin = n-1 Mmin = 0;element
此時時間複雜度爲O(n)。class
2.當元素的初始序列爲反序時,每趟排序中待插入的元素都要和[0,i-1]中的i個元素進行比較且要將這i個元素後移(arr[j+1] = arr[j]),i個元素後移移動次數固然也就爲i 了,再加上temp = arr[i]與arr[j+1] = temp的兩次移動,每趟移動的次數爲i+2,此時比較次數(Cmin)和移動次數(Mmin)達到最小值。循環
Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2)im
Mmax = (1+2)+(2+2)+...+(n-1+2) = (n-1)*(n+4)/2 = O(n2) (i取值範圍1~n-1)
d3
此時時間複雜度爲O(n2)。
3.在直接插入排序中只使用了i,j,temp這3個輔助元素,與問題規模無關,因此空間複雜度爲O(1).
4.在整個排序結束後,即便有相同元素它們的相對位置也沒有發生變化,
如:5,3,2,3排序過程以下
A--3,5,2,3
B--2,3,5,3
C--2,3,3,5
排序結束後兩個元素3的相對位置沒有發生改變,因此直接插入排序是一種穩定排序。