插入法排序的原理。
这里记录下代码效率,一次循环为 c∗n ,嵌套一个循坏为 c∗n2 ,插入法有一个嵌套的循坏,所以效率为 c∗n2 这个档次的。
#include<stdio.h>
main()
{
int a[6] = { 5,2,6,3,7,4 }, i = 0, j = 0,z;
for (i = 1; i < 6; i++)
{
z = a[i];
for (j = i - 1; j >= 0 && a[j] > z; j--)
{
a[j + 1] = a[j];
}
a[j+1] = z;
}
for (i = 0; i < 6; i++)
{
printf("%d,", a[i]);
}
getchar();
}
练习2.1-1:
1、第一个数不需要排序,因此我们从第二个数开始插入。当j=2,将a[j]=41赋值给key(这一步很关键,相当于把将要插入的数放到第三方储存,以后任何涉及a[i]或a[j]的的计算均不会影响正在进行插入的这个数,否则进行
a[i+1]=a[i]
这个移位步骤时由于
i+1=j
会将上一位a[i=j-1]的值赋给a[j],导致数据被改变)。引入变量i,令
i=j−1
,此时a[i]=a[j-1],正好是要插入a[j]的前一位。用a[i]和key比较(注意不是和a[j]比较),假如key大于或等于a[i]则直接将key放在a[i]后一位就可以了(a[i+1]=key)。如果小于,就要和a[i]的前一位a[i-1]比较,如果大于就放a[i-1]后面,以此类推。
练习2.1-2:
伪代码
插入法排序数组A
for j=2 to length(A)
do key=a[j]
//*将a[j]插入a[1..j-1]
i=j-1
while(i>0 and a[i]>key)
do a[i+1]=a[i]
i=i-1
a[i+1]=key