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语句,进行最后的查找排序。
注:在代码中有很多数字,数字的作用是来判断数组的下标和元素
标签:arr,排列,一组,int,C++,letin,temp3,temp2,temp1 来源: https://blog.51cto.com/15093262/2640087