輸入:n個數的一個序列{a1,a2,...,an}。
輸出:輸入序列的一個排列{a1',a2',..., an'},滿足a1' <= a2' <= ... <= an' 。
算法思想:插入排序就的工作方式就像你打牌時會排序一手撲克牌,我們每次從桌子上拿出一張牌,都會插入到相應的位置,使得我們手中的牌一直都是有序的。插入排序就如抓牌一樣,先將數組中的第一個放在第一個,取出第二個放在對應位置,然後再依次插入,直到所有的元素都執行完,得到的序列就是排好序的。
算法僞代碼:
<pre name="code" class="java">INSERTION-SORT(A)
for j = 2 to A.length
key = A[j]
//插入A[j]到排好序的數組A[1..j-1]中
i= j -1
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i - 1
A[i+1] = key
java代碼示例:
public static <E extends Comparable<E>> void InsertionSort(E[] A) {
E key;
int i,j;
for(j=1;j<A.length;j++) {
key = A[j];
i = j -1 ;
while(i>0 && A[i].compareTo(key)>0) {
A[i+1] = A[i];
i = i-1;
}
A[i+1] = key;
}
}
算法分析:
插入排序算法最優情況是當序列已經是要求的有序時,不需要移動任何元素,此時的時間是n的線性函數插入排序的最差情況是當序列爲完全逆序時,它需要將每個元素都要移動,此時效率就非常低,時間複雜度是n的平方
插入排序算法簡單易懂,但是當數據量很大後且其中的數據並不怎麼有序時,它的執行效率十分低,因此我們平常並不使用此排序算法,當數據量比較小且序列較有序時可以適當採用此排序算法,因此真正寫程序時,並不推薦此種排序算法