7-5 简化的插入排序 (15分)
本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
输入格式:
输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。
输出格式:
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。
输入样例:
5
1 2 4 5 7
3
输出样例:
1 2 3 4 5 7
定义一个n+1长度的数组,把要插入的值放在最后,由于原来的数组是有序的,且从小到大排序,只需顺序遍历数组元素,当n+1位置比当前位置要小就与之交换,这样到最后就能完成排序。在运行过程中其实就是到需要插入的位置后把其后每个元素都轮流放到n+1位置一遍。
#include<stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
int a[n+1];
for(i=0;i<=n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++) if(a[i]>a[n])
{a[i]=a[i]+a[n];a[n]=a[i]-a[n];a[i]=a[i]-a[n];}//交换
for(i=0;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
当然也可以不用这样逐个交换 ,先存储需要插入的值,找到需要放入的位置,把这个位置及其后的元素都后移空出位置,然后放入即可。这个思路更具有简洁性。
#include <stdio.h>
int main()
{
int n,i,j,x;
scanf("%d",&n);
int a[n+1];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&x);
for(i=0;i<n;i++) if(a[i]>x)
break;//找位置
for (j=n-1;j>=i;j--){
a[j+1]=a[j];
}//移位置
a[i]=x;//放入
for(i=0;i<n+1;i++)
printf("%d ",a[i]);
return 0;
}