挺水的一道题,这道题我甚至在高中刷题的时候刷到过,也算是一段高中的回忆。但是当时做的时候没有想起来,有点可惜,这道题的关键就是比较、后移、插入。掌握这三个基本就没有问题了。
不过还会有一个卡人的小点,就是当第一项进行位移的时候,要在最后把它补上去。因为第一项前面没有数了,无法继续比较,程序默认不需要排序,因此就会导致第一项的数没有发生改变。
1008: 直接插入排序
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 1535 Solved: 320
Description
编一C程序,该程序可以测试多个测试组,每个测试组它能读入一串整数(以-9999为结束标记)并对它们进行从小到大直接插入排序,同时输出排序时对这些整数进行比较的总次数(输入整数时,相邻的两个用空格隔开,整数个数<2000)。
Input
第一行先输入测试组数T 然后是T个测试组, 每个测试组先输入整数个数N(2<=n<2000) 然后输入1行,包含N个整数,每2个整数之间用空格隔开,以-9999为结束标记
Output
对每个测试组输出2行, 第1行输出比较次数 第2行输出排序后的数,2个数之间用一个空格隔开
Sample Input
1
4
3 2 4 5 -9999
Sample Output
3
2 3 4 5
HINT
代码如下
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int t,i,count=0;
scanf("%d",&t);
int a[t+2];
for(i=1;i<=t+1;i++) //输入
{
scanf("%d",&a[i]);
}
for(i=2;i<=t;i++) //排序开始,从第二项开始
{
int j=i-1;
int x=a[i];
for(j;j>=1;j--) //与前面排好序的进行比较,从后往前
{
count++;
if(x>a[j]) //发现比前面的大,插入,退出
{
a[j+1]=x;
break;
}
else //发现比前面的小,后移,继续往前
{
a[j+1]=a[j];
}
}
if(j==0) //当第一项进行位移的时候,补上第一项
{
a[1]=x;
}
}
printf("%d\n",count);
for(i=1;i<=t-1;i++)
{
printf("%d ",a[i]);
}
printf("%d",a[i]);
putchar('\n');
}
}