插入排序的思想:
每次将一个待排序的记录,按其关键字的大小插入到前面已经排好的子序列中的适当位置,直到全部记录插入完成为止。
插入排序的方法有多种,直接插入排序、希尔排序等
这章我们主要介绍 直接插入排序
基本方法:
设 R = { R1 , R2 , ..... , Rn } 为原始序列,R' = { } 初始为空
基本思想:
一次取出R 中的元素Ri ,然后将Ri 有序的插入R' 中。
#define MAXSIZE 10
typedef int Keytype;
typedef struct
{
Keytype key;
}RecordType;
RecordType R[MAXSIZE];
void InsertSort(RecordType r[],int n)
{
//对表r中的第1列到第n个记录进行直接插入排序
int i,j;
for (i=2;i<=n;i++)
{
r[0]=r[i];
j=i-1;
while (r[0].key<r[j].key)
{
r[j+1]=r[j]; //元素后移
j--;
}
r[j+1]=r[0]; //把存放在r[0]中的原记录放入正确位置
}
}
这里设置的一个监视哨 r[0],将每一次要进行插入的元素赋值给 r[0]
有两种情况:
1.最好的情况:顺序有序,比较 n-1 次,移动 0 次,时间复杂度 O(n)
2.最坏的情况:逆序有序,比较 (n+2)*(n+1)/2, 移动 (n-1)*)(n+4)/2 ,时间复杂度 O(n*n)
由此可得 :插入算法的时间复杂度为 O(n*n) , 空间复杂度为O(1)
test
int main()
{
for (int i=1;i<=10;i++)
{
scanf("%d",&R[i].key);
}
InsertSort(R,10);
for (int i=1;i<=10;i++)
{
printf("%d ",R[i]);
}
printf("\n");
return 0;
}
结果: