排序演算法——插入排序

鴨脖發表於2013-05-05

插入排序就是每一步都將一個待排資料按其大小插入到已經排序的資料中的適當位置,直到全部插入完畢。 


注意是已經排序的資料中的適當位置。


也就是說,每一步的插入都是往已經排好序的子陣列中插入新的值。該演算法的時間複雜度也是O(n^2),精確的說是O(n(n-1))


下面是我寫的一個程式:
void insertSort(int* a,int n){
for(int i=1;i<n;i++){
int cntval = a[i];
int j=i;
for(;j>0;j--){
if(a[j-1]>cntval)
a[j] = a[j-1];
else
break;//檢測到插入位置便跳出來
}
a[j] = cntval;
}
}


下面我們來看一下教科書上寫的更標準的程式:

void insertSort(int* a,int n){
for(int i=1;i<n;i++){
int j=i;
int temp = a[i];
while(j>0&&temp<a[j-1]){
a[j]=a[j-1];j--;
}
a[j] = temp;
}
}


我們來分析一下演算法的時間複雜度:

最好情況下,即已有序的情況下,執行n-1趟,每一趟只比較一次,移動元素兩次,總的比較次數是n-1,移動元素次數是2(n-1),因此最好情況下時間複雜度是O(n);最壞情況下,每趟比較i次,移動元素i+2次,因此需要的比較次數和移動次數是N(N-1)/2,(N+4)(N-1)/2,為O(N^2).


我們可以看出,在內排序的簡單排序演算法中,除了最簡單的簡單選擇排序,插入排序和氣泡排序在最好情況下的時間複雜度都是O(N).這其實是很值得欣慰的一件事。

相關文章