sdut oj C语言 数列有序!

版权声明:本人原创文章若需转载请标明出处和作者!沙沙 https://blog.csdn.net/weixin_44143702/article/details/86526734

数列有序!

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。

Input

输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。

Output

对于每个测试实例,输出插入新的元素后的数列。

Sample Input

3 3
1 2 4
0 0

Sample Output

1 2 3 4

此题可以直接插入然后排序,

但是!!!

此题的目的是为了练习插入排序,如果那样写就十分偷懒,毫无意义,不如不写。

正确做法如下:

#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
    int i, j, n, m;
    while(~scanf("%d %d", &n, &m))
    {
        int a[n + 1];
        int b[n + 1];//定义新数组b,大小比n大1,比a多存一个m
        memset(a, 0, sizeof(a));
        a[n] = 999999;//为了使i = n时不出现越界,使a[n]等于一个很大的数
        memset(b, 0, sizeof(b));//a和b都清零,并为a[n]赋一个很大的值
        if(n == 0 && m == 0)
        {
            break;//如果n和m同时为0表示输入数据的结束
        }
        else
        {
            for(i = 0; i < n; i++)
            {
                scanf("%d", &a[i]);//别忘记取地址!!!
            }

            if(m <= a[0])
            {
                //如果m比a数组第一个数要小,则直接插入放在第一位
                b[0] = m;//先将m存到b[0]
                for(i = 0; i < n; i++)
                {
                    b[i + 1] = a[i];//再将数组a中的数存入后面
                }
            }
            else if(m >= a[n - 1])
            {
                for(j = 0; j < n; j++)
                {
                    b[j] = a[j];
                }
                b[n] = m;
            }
            else
            {
                for(i = 0; i < n; i++)
                {
                    if(m >= a[i] && m < a[i + 1])
                    {//找出适合m插入的位置
                        for(j = 0; j <= i; j++)
                        {
                            b[j] = a[j];
                        }//先插入数组a中小于m的数
                        b[i + 1] = m;//再插入m
                        for(j = i + 2; j <= n; j++)
                        {
                            b[j] = a[j - 1];
                        }//再插入a数组中大于m的数
                        break;//插入后就结束for循环
                    }
                }
            }
        }
        for(i = 0; i < n + 1; i++)
        {
            if(i == 0)
            {
                printf("%d", b[i]);
            }
            else
            {
                printf(" %d", b[i]);
            }
        }
        printf("\n");
    }
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/weixin_44143702/article/details/86526734