C/C++实现在一组排列好的数中插入一组数,并按照原先排列方式进行打印

C/C++实现在一组排列好的数中插入一组数,并按照原先排列方式进行打印

本篇文章以C代码为例,可以直接在编译器上使用。
实现步骤:

1. 确定原来一组数的排序方式

2. 输入一组数

3. 将输入的数按照排序规则进行排序

4. 将输入数插入原来的数


a.输入的是三个一样的数

b.输入的三个数的最大值小于原数的最小值

c.输入的三个数的最小值大于原数的最小值

d.输入的三个数在原数组的两数之间

e. 输入的数与原数组没有关系


代码实现(有些变量没有使用

#include <stdio.h>
void collect(int* p);
void collect(int* p)
{
    int temp1, temp2, temp3;
    int arr[3];//用来存放收集的数
    temp1 = *p;
    temp2 = *(p + 1);
    temp3 = *(p + 2);
    if (temp1 == temp2 && temp2 == temp3)
        ;
    else if (temp1 == temp2 || temp1 == temp3 || temp2 == temp3)
    {
        if (temp1 == temp2)//如果1、2数相等,比较3数与1数
        {
            if (temp1 < temp3)
                ;//输出1<2<3
            else//1>3  1=2>3 将1与3对调
            {
                int temp = 0;
                temp = *p;
                *p = *(p + 2);
                *(p + 2) = temp;
            }//1<2=3
        }
        else if (temp1 == temp3)
        {
            if (temp2 < temp3)//2<1=3  1与2对调
            {
                int temp = 0;
                temp = *p;//5     255
                *p = *(p + 1);//2
                *(p + 1) = temp;//5
            }
            else//1=3<2   将2与3对调
            {
                int temp = 0;
                temp = *(p + 1);
                *(p + 1) = *(p + 2);
                *(p + 2) = temp;
            }
        }
        else//2=3
        {
            if (temp1 < temp3)
                ;//1<2=3  
            else//2=3<1   将1与3对调
            {
                int temp = 0;
                temp = *p;
                *p = *(p + 2);
                *(p + 2) = temp;
            }
        }

    }
    else
    {
        if (temp1 > temp2 && temp1 > temp3)
        {
            if (temp2 > temp3)//3<2<1  1 3调换
            {
                int temp = 0;
                temp = *p;
                *p = *(p + 2);
                *(p + 2) = temp;
            }
            else//2<3<1       
            {
                *p = temp2;
                *(p + 1) = temp3;
                *(p + 2) = temp1;
            }
        }
        else if (temp2 > temp1 && temp2 > temp3)
        {
            if (temp1 > temp3)//3<1<2
            {
                *p = temp3;
                *(p + 1) = temp1;
                *(p + 2) = temp2;
            }
            else//1<3<2   2  3对调
            {
                int temp = 0;
                temp = *(p + 1);
                *(p + 1) = *(p + 2);
                *(p + 2) = temp;
            }
        }
        else//3最大
        {
            if (temp1 > temp2)//2<1<3
            {
                *p = temp2;
                *(p + 1) = temp1;
            }
            else//1<2<3
                ;
        }
    }
}
int main()
{
    int arr[13] = { 1,3,5,7,9,10,25,26,30,35 };
    int i, j, min, max, count;
    int letin[3];

    for (i = 0; i < 10; i++)
    {
        printf("%4d", arr[i]);
    }
    printf("请输入你要添得3个数:>");
    //scanf("%d", &number);//8
    for (i = 0; i < 3; i++)
    {
        scanf("%d", &letin[i]);
    }
    collect(letin);//将插入的数进行排序
    min = letin[0];
    max = letin[2];
    //输入的最小值>原数列的最大值
    //输入的最大值<原数列的最小值
    //直接输出
    if (min > 35 || min == 35)
    {
        arr[10] = letin[0];
        arr[11] = letin[1];
        arr[12] = letin[2];
    }
    else if (max < 1)//先定义一个新数组接收,在将arr重置
    {
        int newarr[13];
        for (i = 0; i < 3; i++)
        {
            newarr[i] = letin[i];
        }
        for (j = 3; j < 13; j++)
        {
            newarr[j] = arr[j - 3];
        }
        for (i = 0; i < 13; i++)
        {
            arr[i] = newarr[i];
        }
    }
    else//分两种情况:第一种letin3个数在arr中两个数之间;第二种无序
    {
        int newletin[3], m, n;
        int newarr[13];
        i = 0;
        //第一种
        while ( i < 10)
        {

            if (arr[i]<min && arr[i + 1]>max)//arr[i]<min<max<arr[i+1]
            {//1 3 5 7 9 10 25       11 12 13(9)  ,26,30,35
                int newarr[13], k, m, n;
                for (j = 0; j <= i; j++)
                {
                    newarr[j] = arr[j];
                }
                for (j = i + 1; j <= i + 3; j++)
                {//7     6  7                    7-7 7-6 7-5
                    newarr[j] = letin[j - i - 1];//7  0
                }
                for (j = i + 4; j < 13; j++)
                {//      10          7
                    newarr[j] = arr[j - 3];//26
                }
                for (n = 0; n < 13; n++)
                {
                    arr[n] = newarr[n];

                }
                //break;
            }
            i++;
        }
        count = 0;
        for (j = 0; j < 3; j++)//无序
        {
            for (i = 0; i < 10; i++)
            {//1,3,5,7,9,10,25,26,30,35       4 8 11
                if (arr[i] > letin[j])
                {
                    newletin[j] = i;//2  4  6
                    break;
                }
            }         //  0,1,2,3,4,5,6, 7, 8, 9,10,11,12  
        }//               1,3,4,5,7,8,9,10,11,25,26,30,35       
        for (m = 0; m < newletin[0]; m++)//[0,2)
        {
            newarr[m] = arr[m];//0 1->1 3                                                         1  3
        }
        newarr[newletin[0]] = letin[0];//  2  ///////////////////////////////////////////////           4
        for (m = newletin[0]+1; m <= newletin[1]; m++)//[3,4)
        {/////////[3,4]     2,3
            newarr[m] = arr[m-1];//1,3,5,7,9,10,25,26,30,35
        }                        //0,1,2,3,4, 5, 6, 7, 8, 9
        newarr[newletin[1]+1] = letin[1];//5   8
        for (m = newletin[1]+2; m <= newletin[2]+1; m++)//[5,6)
        {///////m=6  m=7
            newarr[m] = arr[m-2];
        }
        newarr[newletin[2]+2] = letin[2];//8
        for (m = newletin[2]+3; m < 13; m++)//[7,13)
        {///m=9 m<13
            newarr[m] = arr[m-3];
        }
        //newarr存有全部元素
        for (i = 0; i < 13; i++)
            arr[i] = newarr[i];
    }
    for (i = 0; i < 13; i++)
        printf("%d ", arr[i]);
    return 0;

}

在主函数中的if - else if - else
else语句中使用了一个while语句和for语句。


while语句的作用是判断输入的三个数是否在原数组的两个数之间。如果遍历了原数组和输入数组发现条件不成立,就结束while语句。
进入for语句,进行最后的查找排序。
注:在代码中有很多数字,数字的作用是来判断数组的下标和元素

猜你喜欢

转载自blog.51cto.com/15093262/2640087