Loading

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;
}
posted @ 2021-11-30 09:15  EEvinci  阅读(198)  评论(0编辑  收藏  举报