在要排序的一組數中,假設前面(n-1)[n>=2] 個數已經是排好順序的,現在要把第n個數找到相應位置並插入,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。
//插入排序
public void insertionsort()
array[insertpoint+1]= temp; //找到了插入位置,插入待排序元素
system.out.print("第"+counter+"輪排序結果:");
display();
counter++;
} }
在第一趟排序中,插入排序最多比較一次,第二趟最多比較兩次,依次類推,最後一趟最多比較n-1次。因此有:
1+2+3+...+n-1 =n*n(n-1)/2
因為在每趟排序發現插入點之前,平均來說,只有全體資料項的一半進行比較,我們除以2得到:
n*n(n-1)/4
複製的次數大致等於比較的次數,然而,一次複製與一次比較的時間消耗不同,所以相對於隨機資料,這個演算法比氣泡排序快一倍,比選擇排序略快。
與氣泡排序、選擇排序一樣,插入排序的時間複雜度仍然為o(n2),這三者被稱為簡單排序或者基本排序,三者都是穩定的排序演算法。
如果待排序陣列基本有序時,插入排序的效率會更高。
在插入某個元素之前需要先確定該元素在有序陣列中的位置,上例的做法是對有序陣列中的元素逐個掃瞄,當資料量比較大的時候,這是乙個很耗時間的過程,可以採用二分查詢法改進,這種排序也被稱為二分插入排序。
改進後的**如下:
//二分插入排序
public void binaryinsertionsort()
array[insertindex]= temp; //插入待排序元素到正確的位置
} system.out.print("第"+counter+"輪排序結果:");
display();
counter++;
} }
/**
* 二分查詢法
* @param lowerbound 查詢段的最小下標
* @param upperbound 查詢段的最大下標
* @param target 目標元素
* @return 目標元素應該插入位置的下標
*/
public int binarysearch(int lowerbound,int upperbound,int target)else
} return lowerbound;
}
還有一種在二分插入排序的基礎上進一步改進的排序,稱為2-路插入排序,其目的是減少排序過程中移動記錄的次數,但為此需要n個記錄的輔助空間。
演算法的思想為:另設乙個和原始待排序列l相同的陣列d,首先將l[1]複製給d[1],並把d[1]看成是已排好序的序列中處於中間位置的元素(樞紐元素),之後將l中的從第二個元素開始依次插入到陣列d中,大於d[1]的插入到d[1]之後的序列(此處我稱為右半邊序列,用的是陣列左半部分空間),小於d[1]的插入到d[1]之前的序列(左半邊序列,用的是陣列右半部分空間)。
該演算法將陣列當做首尾銜接的環形結構來使用。
示意圖如下:
排序完成之後,陣列中的元素並不是按照下標公升序排列的,而是靠first與final指標確定起始元素。
注意:當l[1]為最小值時,2-路插入排序失去它的優越性,等同於二分插入排序。
**如下:
//2-路插入排序
public void two_wayinsertionsort()else if(array[i] < newarray[first])else if(array[i] >= newarray[0])while(newarray[curindex]>array[i]);
newarray[curindex+1]= array[i]; //插入到正確的位置
}elsewhile(newarray[curindex]<=array[i]);
newarray[(curindex-1+len)%len]= array[i]; //插入到正確的位置
} for(int j=0;j如果對如下陣列進行排序
8,1,11,12,4,20,7,2,6,15
列印結果如下:
此時,first指向下標為5的元素(1),last指向下標為4的元素(20)
插入排序的改進演算法 希爾排序
希爾排序 shell s sort 又稱縮小增量排序,類屬於插入排序。考慮到直接插入排序得一下特點 1 在待排序數基本有序情況下排序效率大大提高 2 在n很小時,其排序效率也很高。基於以上考慮,對直接插入排序進行改進,並得出希爾排序。其基本思想為 先將整個待排序記錄序列分割成若干子串行分別進行直接插...
排序演算法(三)插入排序
今天來更新排序演算法中的第三種演算法 插入排序插入排序是基於比較的排序。所謂的基於比較,就是通過比較陣列中的元素,看誰大誰小,根據結果來調整元素的位置 因此,對於這類排序,就有兩種基本的操作 比較操作 交換操作其中,對於交換操作,可以優化成移動操作,即不直接進行兩個元素的交換,還是用乙個樞軸元素 t...
排序演算法(三) 插入排序
一 直接插入排序 最差時間複雜度 o n 2 最優時間複雜度 o n 平均時間複雜度 o n 2 穩定性 穩定 直接插入排序 insertion sort 是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對未排序的資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序演算法的一般...