有一个已经排好序的数组,现向该数组中插入一个数,要求原来的排序趋势(升序或者降序)不变。

题目分析

        首先要知道一个已经排好序的数组是定长的,如果要像该数组中插入一个数,肯定需要将该数组扩容或者说定义一个新的数组(原来的数组长度 + 1),其次就是将插入的数对比原有数组进行排序。

代码实现 

#include <stdio.h>

int main()
{
	//这里初始化的是一个升序排序的数组,如需降序,可手动更改即可
	//后面代码保持不变
	int pSou[10] = { 1, 4, 6, 8, 10, 34, 56, 60, 67, 100 };
	//定义一个新数组
	int pNew[11] = { 0 };
	int nPutnum = 0;
	//因为上面的初始化数组可自定义变换趋势,所以需要一个标志位来
	//判断该数组是降序还是升序(0为升序,1为降序)
	int nFlag = 0;

	//先判断数组是升序还是降序
	if (pSou[0] > pSou[1])
	{
		nFlag = 1;
	}

	printf("初始化数组为:\n");
	for (int nIndex = 0; nIndex < 10; ++nIndex)
	{
		printf("%d  ", pSou[nIndex]);
		//将初始化数组的值赋值给新数组
		pNew[nIndex] = pSou[nIndex];
	}
	printf("\n请输入想要插入的数:");

	scanf("%d", &nPutnum);

	//如果为升序
	if (0 == nFlag)
	{
		//如果输入的数小于第一个数
		if (nPutnum <= pNew[0])
		{
			for (int nIndex = 10; nIndex > 0; --nIndex)
			{
				//将所有数组元素往后移
				pNew[nIndex] = pNew[nIndex - 1];
			}
			//将输入值赋值给第一个
			pNew[0] = nPutnum;
		}//如果输入的数大于最后一个数
		else if (nPutnum >= pNew[9])
		{
			pNew[10] = nPutnum;
		}//输入的数在中间
		else
		{
			//查找需要插入的位置
			for (int nIndex = 1; nIndex < 9; ++nIndex)
			{
				//找到插入的位置
				if (nPutnum <= pNew[nIndex])
				{
					int nIdx = 0;
					for (nIdx = 10; nIdx > nIndex; --nIdx)
					{
						//将插入位置之后的所有元素往后移
						pNew[nIdx] = pNew[nIdx - 1];
					}
					pNew[nIdx] = nPutnum;
					break;
				}
			}			
		}
	}
	else//如果为降序
	{
		//如果输入的数大于第一个数
		if (nPutnum >= pNew[0])
		{
			for (int nIndex = 10; nIndex > 0; --nIndex)
			{
				pNew[nIndex] = pNew[nIndex - 1];
			}
			pNew[0] = nPutnum;
		}//如果输入的数小于最后一个数
		else if (nPutnum <= pNew[9])
		{
			pNew[10] = nPutnum;
		}//输入的数在中间
		else
		{
			for (int nIndex = 1; nIndex < 9; ++nIndex)
			{
				if (nPutnum >= pNew[nIndex])
				{
					int nIdx = 0;
					for (nIdx = 10; nIdx > nIndex; --nIdx)
					{
						pNew[nIdx] = pNew[nIdx - 1];
					}
					pNew[nIdx] = nPutnum;
					break;
				}
			}
		}
	}
	//输出
	printf("插入后的数组为:\n");
	for (int nIndex = 0; nIndex < 11; ++nIndex)
	{
		printf("%d  ", pNew[nIndex]);
	}
	printf("\n");

    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值