从整个待排序列中选出一个元素插入到已经有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个序列的待插入元素为0,则整个序列全部有序。
在实际的算法中,我们经常选择序列的第一个元素作为有序序列(因为一个元素肯定是有序的),我们逐渐将后面的元素插入到前面的有序序列中,直到整个序列有序。
代码
#include<stdio.h>
#include<stdlib.h>
void InsertionSort(int *a,int n);
void main()
{
int a[] = {2,4,6,8,0,1,5,9,7,3};
int i;
InsertionSort(a,10);
for(i = 0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
system("pause");
}
void InsertionSort(int *a,int n)//插入比前一个大的比后一个小的 ,n为传入的数组元素个数
{
int temp;
int in,out;
for(out = 1;out<n;out++) //out为传出将要插入的数组标号(从1开始)
{
temp = a[out]; //先把传出的元素赋值给temp
in = out; //in为传人将要插入的数组标号
while(in>0 && a[in-1]>=temp) //当传入的数组标号大于0并且前一个大于
{ //temp的值时
a[in] = a[in-1];//当传入插入的前一个元素大于temp时,将元素后移
in--;
} //直到传入插入的前一个元素小于temp时退出循环
a[in] = temp; //当传入插入的前一个元素小于temp时,最后一次循环将元素后移,in--,将插入的元素传入in
}
}
运行结果:
Front
2 4 6 8 0 1 5 9 7 3
Back
0 1 2 3 4 5 6 7 8 9
时间复杂度
平均来说插入排序算法的时间复杂度为O(n^2)
总结:
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)
网友评论