有序序列中插入一个整数

简介: 有序序列中插入一个整数

3acc6b21d7604520ace22751a3a23d0d.png思路:

将输入的要插入的数m依次和数组中的元素进行比较。

思:

在排好序的数组中,从右往左比较还是从左往右比较?

其实都可以,但是我觉得从右边(也就是最大的数)依次开始比较,程序比较简单些。

从最大的数也就是数组组下标为n-1的元素比较,若是m<a[n-1],则把这个数“移到”它后面(也就是赋值),m再和数组下标为n-2的元素进行比较,若是m<a[n-2],就把这个数“移到”后面,若此时m≥a[n-2],就把m放在数组下标为n-1的位置上。(前面已经把下标为n-1的元素“移到”后面一位,现在n-1这个位置虽然还存放着最初的初值,此时可以方便理解,理解为“垃圾值”)

而之前的为比较的元素,位置就可以不用移动了。

bce654a506f84b2f86167eea434a9ed8.jpg

例:

对数组元素赋初值之后,“1 4 7 9”

8和9进行比较,8<9,9移到下一位

然后8和7比较,8>7,8就填到7后面的一位。

前面不变,进行输出。

代码实现

#include <stdio.h>
int main (void)
{
  int n,a[50]={0};//n为数组元素的个数,数组初始化为0
  int i; //i 作为计数器
  int m=0;//m 为要插入的数据
  //输入数据
  printf("请输入n的值:\n");
  scanf("%d",&n);
  printf("请输入%d个数(从小到大排列):\n",n);
  for (i=0;i<n;i++)
    scanf("%d",&a[i]);
  printf("请输入要插入的数:\n");
  scanf("%d",&m);
  for (i=n-1;m<a[i];i--)//i赋初值,即数组中的最后一个元素
    a[i+1]=a[i];//若不满足循环的条件,不进入循环体,得到变量i的值
  a[i+1]=m;//将m赋值给第i的下一个元素
  for (i=0;i<n+1;i++)//这时数组为n+1个数
    printf("%-2d",a[i]);
  printf("\n");
  return 0;
}

方法二:

如果得知要插入的数,即m排在第几个就好了。

所以可以先讨论m的下标,

分为:

若m小于序列中最小的数,则m的下标为0;(1)

若m大于序列中最大的数,则m的下标为n;(2)

若m大于序列中第i个数,小于第 i+1个数,则m的下标为i+1;(3)

对于第一种情况,将原来数组中所有的数都往后面移动一位。即a[i+1]=a[i],i从n-1开始,i–

对于第二种情况,直接在原数组的第n个元素重新赋值为m就可以了。

对于第三种情况,在k<=i的元素,原来元素不变,第i+1个元素以及之后的元素,都要往后面移动一个坑,留下一个位置给m。即先a[i+1]=a[i],i从n-1开始,i–,然后给a[i+1]重新赋值为m。

代码实现:

#include <stdio.h>
int main (void)
{
  int n,a[50]={0}; //数组初始化为0
  int i,index,k;
  int m=0;//要插入的数 m初始化为0
  //输入数据
  printf("请输入n的值:\n");
  scanf("%d",&n);
  printf("请输入%d个从大到小排列的数:\n",n);
  for (i=0;i<n;i++)
    scanf("%d",&a[i]);
  printf("请输入要插入的m的值:\n");
  scanf("%d",&m);
  if (m>=a[n-1]) //m大于最大的数
    a[n]=m;
  else if (m<=a[0]) //m小于最小的数
  {
    for (i=n-1;i>=0;i--)
      a[i+1]=a[i];
    a[0]=m;
  }
  else   //m在中间
  {
    for (i=0;i<n;i++)
      if (m>=a[i] && m<a[i+1])
      index=i+1;//得到m的下标,把它赋值给index
    for (k=n-1;k>=index;k--) //对于下标为index之后的元素,都往后面“移动一位”
      a[k+1]=a[k];
    a[index]=m;//留下一个空位,即第index位,插入m
  }
  for (i=0;i<=n;i++)   //输出n+1个元素
    printf("%-2d",a[i]);
  return 0;
}


相关文章
|
存储 对象存储 UED
CDN适用哪些场景?
CDN是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。今天为大家分享几个CDN的典型适用场景。
16731 0
|
3月前
|
存储 开发者 Docker
使用Docker清理日志释放磁盘空间
使用Docker清理日志释放磁盘空间
366 98
|
10月前
|
机器学习/深度学习 资源调度 计算机视觉
RT-DETR改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
RT-DETR改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
458 2
RT-DETR改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
|
2月前
|
消息中间件 运维 监控
SaaS云医院HIS系统源码,运行稳定的区域HIS系统
一套SaaS架构的Java版云HIS系统源码,支持电子病历四级应用。采用前后端分离技术,前端基于Angular,后端使用SpringBoot+MyBatisPlus,结合Redis、RabbitMQ、XXL-JOB等主流组件。
221 2
SaaS云医院HIS系统源码,运行稳定的区域HIS系统
|
7月前
|
存储 监控 算法
内网监控桌面与 PHP 哈希算法:从数据追踪到行为审计的技术解析
本文探讨了内网监控桌面系统的技术需求与数据结构选型,重点分析了哈希算法在企业内网安全管理中的应用。通过PHP语言实现的SHA-256算法,可有效支持软件准入控制、数据传输审计及操作日志存证等功能。文章还介绍了性能优化策略(如分块哈希计算和并行处理)与安全增强措施(如盐值强化和动态更新),并展望了哈希算法在图像处理、网络流量分析等领域的扩展应用。最终强调了构建完整内网安全闭环的重要性,为企业数字资产保护提供技术支撑。
213 2
|
8月前
|
Kubernetes 安全 应用服务中间件
IngressNightmare:Ingress Nginx 再曝5个安全漏洞,可接管你的 K8s 集群
是否还记得 2022 年 K8s Ingress Nginx 披露了的 3 个高危安全漏洞(CVE-2021-25745, CVE-2021-25746, CVE-2021-25748),并在那一年宣布停止接收新功能 PR,专注修复并提升稳定性。
|
9月前
|
数据采集 API 开发工具
从 0 到 1 掌握鸿蒙 AudioRenderer 音频渲染:我的自学笔记与踩坑实录(API 14)
本文详细介绍了在 HarmonyOS 中使用 AudioRenderer 开发音频播放功能的完整流程。从环境准备(SDK 5.0.3、DevEco Studio 5.0.7)到核心概念(状态机模型、异步回调),再到开发步骤(实例创建、数据回调、状态控制),结合代码示例与常见问题解决方法,帮助开发者掌握 AudioRenderer 的底层控制与定制化能力。同时,文章还提供了性能优化建议(多线程处理、缓冲管理)及学习路径,附带官方文档和示例代码资源,助你快速上手并避开常见坑点。
356 7
|
JavaScript
vue element plus Input Number 数字输入框
vue element plus Input Number 数字输入框
940 0
|
Java 数据库连接 API
Seata异常捕获问题之回滚事务如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
904 98
|
XML 移动开发 前端开发
DOCTYPE 的作用是什么?
DOCTYPE 的作用是什么?
381 0