数据结构——C语言实现直接插入排序算法
一、基本思想
直接插入排序算法是在一个已经有序的记录上,将下一个待排序的数,有序的插入已排好序的记录中,这个过程一直持续到将所有待排数全部插入到有序记录中才停止。
例如,如果将一组数: 2 5 3 7 4 3*
用直接插入排序算法实现从小到大的排序,那么其过程如下所示:
(2) 5 3 7 4 3*
(2 5) 3 7 4 3*
(2 3 5) 7 4 3*
(2 3 5 7) 4 3*
(2 3 4 5 7) 3*
(2 3 3* 4 5 7)
由上述过程我们可以看到两个3在比较时后面一个3*在排序之后仍然处于后面的位置,这就体现出了直接插入排序算法的稳定性。
二、C语言算法实现
#include<stdio.h>
void InsertSort(int a[],int length) //从小到大排序
{
int i,j,temp;
for(i=1;i<length;i++)//从数组的第二个值开始插入
{
if(a[i]<a[i-1]) //若第i位小于第i-1位
{
temp=a[i]; //将第i位暂放入temp中,这时可以想象为第i位为空
a[i]=a[i-1]; //将第i-1位后移一位到第i位中,这时可想象为第i-1位为空
for(j=i-2;a[j]>temp;j--) //继续将temp中的值和第i-2位比较
{
a[j+1]=a[j]; //若第i-2位大于temp,则将第i-2位后移到第i-1位中
}
a[j+1]=temp; //循环至第j位小于等于temp值时,则将temp值放在第j+1位中
}
}
}
int main()
{
int i;
int r[6]={2,5,3,7,4,3};
InsertSort(r,6);
for(i=0;i<6;i++) //循环输出
printf("%d",r[i]);
}
运行结果为
接下来我们来分析直接插入排序算法的复杂度:
空间复杂度:在这个算法中所占用的额外空间只有temp,temp用来暂时存放待插入的数,所以空间复杂度为S(n)=O(1)。
时间复杂度:执行算法的时间耗费主要取决于数据的分布情况,最好的情况是所有记录是顺序,最坏情况是逆序。若待排序记录是随机的,则时间复杂度T(n)=O(n²)
从算法的基本思想来看,直接插入排序算法简便且比较适用于记录数目少且基本有序的情况,当待排序数目较大时,其性能就不好。