(只是一个数组题目罢了)
直接插入排序,是指将无序序列中的各元素依次插入到已经有序的数组中。
假设数组中前i-1
元素已经有序,现在要将线性表中第i
个元素插入到前面的有序子表中,插入过程如下:
以长度为n=8
的序列(13,6,1,31,9,27,5,11)
的插入排序过程做示范: 第1趟:将数组第2
个元素6
向前插入后,则数组中元素为(6,13,1,31,9,27,5,11)
; 第2趟:将数组第3
个元素1
向前插入后,则数组中元素为(1,6,13,31,9,27,5,11)
; 第3趟:将数组第4
个元素31
向前插入后,则数组中元素为(1,6,13,31,9,27,5,11)
; …… 第7趟:将数组第8
个元素11
向前插入后,则数组中元素为(1,5,6,9,11,13,27,31)
; 总之,共执行7
趟操作,可将有n=8
个元素的数组排成有序序列。
插入排序从第二个数开始,拿出第二个数向前进行插入排序,一直到最后一个数向前做插入排序,要求输出每趟插入排序的结果。
测试输入:
10
47 47 21 69 2 8 76 50 9 47
预期输出:
47 47 21 69 2 8 76 50 9 47
21 47 47 69 2 8 76 50 9 47
21 47 47 69 2 8 76 50 9 47
2 21 47 47 69 8 76 50 9 47
2 8 21 47 47 69 76 50 9 47
2 8 21 47 47 69 76 50 9 47
2 8 21 47 47 50 69 76 9 47
2 8 9 21 47 47 50 69 76 47
2 8 9 21 47 47 47 50 69 76
提示: 如果有10
个整数,要求输出每趟插入排序共9
趟的结果。
这里我调用了自定义函数来实现程序,真正编写时可以不用函数。具体怎么做,就请读者自己思考啦。
编写程序:
#include<stdio.h>
#define N 100
int ONE (int a[],int n)
{
int i,m;
for (m=2;m<n+1;m++)
{
a[0]=a[m];
for(i=m-1;i>=1;i--)
{
if (a[0]<a[i])
a[i+1]=a[i];
else break;
}
a[i+1]=a[0];
for(i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
}
int main()
{
int a[N],n,i;
scanf ("%d",&n);
for (i=1;i<=n;i++)
scanf ("%d",&a[i]);
printf ("\n");
ONE(a,n);
return 0;
}
运行结果:
运行成功!