7-1-1 简化的插入排序 (15 分)
7-1-1 简化的插入排序 (15 分)
本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
输入格式:
输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。
输出格式:
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。
输入样例:
5
1 2 4 5 7
3
结尾无空行
输出样例:
1 2 3 4 5 7
结尾无空行
代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
int x;
scanf("%d",&x);
int temp;
for(int i = 0; i < n; i++)
{
if(x < a[i])
{
temp = a[i];
a[i] = x;
x = temp;
}
printf("%d ",a[i]);
}
printf("%d ",x);
}
这个方法是我看到的写的最好的一个方法,避开了传统的双重循环(插入一个元素, 如果不是末尾就要其他元素向后移动一位), 直接把时间复杂度从O(n^2)降到了O(n), 而且是一种动态的计算输出方法, 在构思上就高级了一个阶层
#include <stdio.h>
int main()
{
int n,i,j,b,temp;
int a[11];
scanf("%d",&n);
for(i = 0;i < n;i++)
scanf("%d",&a[i]);
scanf("%d",&b);
//开始吟唱
for(i = 0;i <= n;i++){
if(b <= a[i]){
for(j = n;j > i;j--){
a[j] = a[j-1];
}
a[i] = b;
break;
}
//这两个判断我觉得是有点鸡肋的判断,就是那种觉得对又觉得哪里有些奇怪,但在这个程序里面还需要
if(b == a[n-1])
a[n] = b;
if(b>a[n-1])
a[n] = b;
}
//终止吟唱
//输出元素
for(i = 0;i <= n;i++)
printf("%d ",a[i]);
return 0;
}