大一新生上手题(题目加源代码详解)(每日一题,一题多解)

2019 数列有序!

Problem Description

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

ut

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

Output

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

Sample Input

3 3
1 2 4
0 0

Sample Output

1 2 3 4

方法一:如果插入的数比最后一个数大,则插入的数放在数组a的末尾;否则,则将插入的数依次与a[0]~a[n-1]进行比较,直到a[i]>target,说明i之前的数都小于target,i之后的都大于target,所与target就要插在a[i]与a[i-1]之间

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define N 100

void Sort(int arr[], int m)
{//冒泡排序法
	int i,j;
	for (i = 0; i < m-1; i++)//趟数
	{
		for (j = 0; j < m- 1-i; j++)//相邻两元素进行比较
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
					arr[j + 1] = temp;
			}
		}

	}
}
int main()
{
	int a[N];
	int i,n;
	printf("input n:");
	scanf("%d", &n);
	printf("input %d numbers:",n );
	for (i = 0; i < n;i++)
	{
		scanf("%d", &a[i]);
	}
	int target;
	int temp1, temp2,j;
	printf("input the target:");
	scanf("%d", &target);
	Sort(a, n );
	if (target > a[n-1])
	{
		 a[n]=target;//我写这题研究了一天都是错的,问题就在这,我写成了target=a[n]就一直达不到正确目的
	}
	else
	{
		for (i = 0; i < n; i++)
		{
			if (a[i] > target)
			{
				temp1 = a[i];//把a[i]的位子让出来给target,a[i]的值暂存在temp1中
				a[i] = target;
				for (j = i + 1; j <= n; j++)//依次执行将位子向后移动一个
				{
					temp2 = a[j];//a[i+1]即a[j]的值暂存在temp2中,把位子让给a[i];
					a[j] = temp1;
					temp1 = temp2;//在把a[i+1]即a[j]的值暂放在temp1这个中间变量上;
				}//然后执行第二次循环:把a[i+2]即a[j+1]的值存放到temp2中,继续上述操作直到最后一个元素
				break;//完成上面这个循环后就不在执行第一个循环就结束了
			}
		
		}
	}
	for (i = 0; i <=n; i++)
	{
		printf("%d ", a[i]);//再将插入数字后的数组打印出来
	}
}

 方法二:定义一个数组,输入要插入的数,直接将插入的数放到数组的末尾,然后进行排序就行了

​
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define N 30
void Sort(int arr[], int m)
{//冒泡排序法
	int i,j;
	for (i = 0; i < m-1; i++)//趟数
	{
		for (j = 0; j < m- 1-i; j++)//相邻两元素进行比较
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
					arr[j + 1] = temp;
			}
		}

	}
}
int main()
{

	int a[N];
	int i, j;
	int target;
	int n;
	printf("input n:");
	scanf("%d", &n);
	printf("input %d numbers", n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	printf("input target:\n");
	scanf("%d", &target);
	a[n] = target;
	Sort(a, n + 1);
//下面是选择排序的方式对数组进行排序
	/*for (i = 0; i < n; i++)
		for (j = 0; j < n- i; j++)
			if (a[j] > a[j + 1])
			{
				swap = a[j];
				a[j] = a[j + 1];
				a[j + 1] = swap;
			}*/

	for (i = 0; i <=n; i++)
		printf("%d ", a[i]);


	return 0;
}

​

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值