1.简答插入排序算法的原理如下:
(1)待排序数组A[0…n-1]分为有序区和无序区,初始状态下整个数组中只有A[0]属于有序区。
(2)从下表为1的元素开始遍历,第i次遍历时,将A[i]插入到有序区某个位置,保持有序区仍然为有序,有序区元素个数加1。
(3)举个栗子,对数组A={3,5,4,0}进行插入排序
初始状态:3,5,4,0
第一步:3,5,4,0
第二步:3,4,5,0
第三步:0,3,4,5
(4)注意和选择排序不同,选择排序是每次从无序部分选择最小元素,而简单插入排序则是每次将无序部分的最开始的元素插入到有序部分的合适位置。
2.程序实现:
void insertSort(int a[],int n)
{
int elem;
for(int i=1;i<n;i++)
{
elem=a[i];
while(elem<a[i-1]&&(i-1)>=0)//寻找elem在有序区的位置
{
a[i]=a[i-1];//平移元素
i-=1;
}
a[i]=elem;//将elem元素放入合适位置
}
}
3.时间复杂度分析:
算法中的基本操作可以认为是比较。
最坏情况下,即数组元素降序排列,第i次遍历,需要比较i次,因此一共需要比较(1+2+…+n-1)=n(n-1)/2次。
所以时间复杂度为O(n^2)。
4.稳定性:
简单插入排序是稳定的。
算法中只有在当前待排序元素a[j]<a[j-1]时才进行平移操作,因此对于2 5 5这种情况,排序后,两个5的相对顺序并不改变。