#include <iostream>
using namespace std;
void InsertionSort(int A[],int len){
int i,j;
for(i=1;i<len;i++){
j=i-1;
int t=A[i];
while(j>=0&&A[j]>t){
A[j+1]=A[j];
j--;
}
A[j+1]=t;
}
}
void print(int A[],int len){
int i=0;
for(i=0;i<len;i++)
cout<<A[i]<<" ";
cout<<endl;
}
void main(){
int A[15]={12,3,4,6,98,123,3,56,78,11,65,455,324,0,1};
print(A,15);
InsertionSort(A,15);
print(A,15);
}
(1)时间复杂度
从时间分析,首先外层循环要进行n-1次插入,每次插入最少比较一次(正序),移动两次;最多比较i次,移动i+2次(逆序)(i=1,2,…,n-1)。若分别用Cmin ,Cmax 和Cave表示元素的总比较次数的最小值、最大值和平均值,用Mmin ,Mmax 和Mave表示元素的总移动次数的最小值、最大值和平均值,则上述直接插入算法对应的这些量为:
Cmin=n-1 Mmin=2(n-1)
Cmax=1+2+…+n-1=(n2-n)/2 Mmax=3+4+…+n+1=(n2+3n-4)/2
Cave=(n2+n-2)/4 Mmax=(n2+7n-8)/4
因此,直接插入排序的时间复杂度为O(n2)。
由上面对时间复杂度的分析可知,当待排序元素已从小到大排好序(正序)或接近排好序时,所用的比较次数和移动次数较少;当待排序元素已从大到小排好序(逆序)或接近排好序时,所用的比较次数和移动次数较多,所以插入排序更适合于原始数据基本有序(正序)的情况.
插入法虽然在最坏情况下复杂性为O(n2),但是对于小规模输入来说,插入排序法是一个快速的排序法。许多复杂的排序法,在规模较小的情况下,都使用插入排序法来进行排序,比如快速排序。
(2)空间复杂度
首先从空间来看,它只需要一个元素的辅助空间,用于元素的位置交换O(1)
(3)稳定性:
插入排序是稳定的,因为具有同一值的元素必然插在具有同一值得前一个元素的后面,即相对次序不变.