- 問題:給定一個整數序列,按照從小到大的順序(確切地說,是非遞減的順序)排列序列中的整數。
- 輸入:一個整數序列。
- 輸出:整數序列,其中的整數升序排列。
插入排序的思想:插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素。當然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩定的。
插入排序的C語言實現如下(a為數組首地址, size為數組中的元素個數):
void insertion_sort(int *a, size_t size)
{
int i, j, t;
for(i = 1; i < size; i++){
t = a[i];
j = i - 1;
while(j >= 0){
if(a[j] > t){
a[j + 1] = a[j];
}
else
break;
j--;
}
j += 1;
a[j] = t;
}
}
插入排序的時間復雜度分析。在最壞情況下,數組完全逆序,插入第2個元素時要考察前1個元素,插入第3個元素時,要考慮前2個元素,……,插入第N個元素,要考慮前 N - 1 個元素。因此,最壞情況下的比較次數是 1 + 2 + 3 + ... + (N - 1),等差數列求和,結果為 N^2 / 2,所以最壞情況下的復雜度為 O(N^2)。
最好情況下,數組已經是有序的,每插入一個元素,只需要考查前一個元素,因此最好情況下,插入排序的時間復雜度為O(N)。
2015-03-18 Wed
本系列文章(更新中):
