插入排序,搞起来,一路狂奔,数组插入

news2024/11/19 19:23:52

 一点喽

目录

编程实现:程序功能是在一个有序序列中插入一个数后,该数列依然有序

输入测试数据:2  3  5  7  8  23  34  56  78  90

25

程序运行结果:插入之后的数组为   2   3   5   7   8  23  25  34  56  78  90

第一个就遇到这么多问题:​编辑

Run-Time Check Failure #2 - Stack around the variable 'arr1' was corrupted.

迅速链接到哥:

 附上代码:

代码解释

初始化

打印原数组

获取用户输入

找到插入位置

移动元素

插入元素

打印新数组

总结


编程实现:程序功能是在一个有序序列中插入一个数后,该数列依然有序

输入测试数据:2  3  5  7  8  23  34  56  78  90

25

程序运行结果:插入之后的数组为   2   3   5   7   8  23  25  34  56  78  90

第一个就遇到这么多问题:

这已经改了4次喽

 裂开

Run-Time Check Failure #2 - Stack around the variable 'arr1' was corrupted.

解决以上:

"Run-Time Check Failure #2 - Stack around the variable 'arr1' was corrupted." 这个错误通常发生在C或C++程序中,当程序试图访问或修改数组arr1边界之外的内存时。这通常意味着程序中有数组越界的错误。

数组越界通常发生在以下几种情况:

  1. 访问数组时使用了错误的索引。比如,数组arr1有11个元素,索引范围应该是0到10(包含),但如果尝试访问arr1[11]或更高的索引,就会越界。

  2. 在移动数组元素时,可能不小心覆盖了数组边界之外的内存。比如,代码中的循环:

for (int j = 10; j > i; j--) {
arr1[j + 1] = arr1[j];
}

如果i等于10,循环不会执行,这是正确的。但是,如果i小于10,j最终会等于i,并且会尝试访问arr1[i + 1],这没有问题,因为要将arr1[i]的值向后移动。然而,紧接着设置arr1[i + 1] = x;,这实际上是在写入arr1数组边界之外的内存,因为有效的索引范围是0到10。

为了修复这个问题,应该确保只写入数组的有效索引范围内。插入代码应该如下所示:

// 将从插入位置开始的元素向后移动一位
for (int j = 9; j >= i; j--) {
arr1[j + 1] = arr1[j];
}
// 在位置i插入新元素x
arr1[i] = x;

注意,这里我们不需要arr1[i + 1] = x;,因为我们已经在上面的循环中将i位置及其后的所有元素向后移动了一位,现在i位置是空的,我们直接在这里插入新元素。

确保程序中没有其他地方访问或修改了arr1数组越界的内存。对于数组操作,始终确保索引在有效范围内(即,0到数组大小减1)。

 

 依旧是问题:

 

迅速链接到哥:

内层循环的写法。内层循环放在了外层循环的条件判断中,这会导致内层循环被错误地多次执行。

注意以下几点:

  1. 内层循环 for (int j = 9; j >= i; j--) 现在正确地只执行一次,用于移动元素。
  2. 在内层循环之后,使用 arr1[i] = x; 来插入新元素 x
  3. 最后一个 for 循环用于打印修正后的数组,其条件现在是 i < 11,因为数组现在包含11个元素。

改用K,真的蛋疼: 

    for (int k = 0; k < 11; k++) 

还是加上,我要吐了:

// 确保不会访问arr1[11],防止数组越界  

 附上代码:

#include<stdio.h>
int main()
{
	int arr1[11] = { 2,3,5,7,8,23,34,56,78,90 };
	int i = 0;
	int x = 0;
	printf("原数组为:");
	for ( i = 0; i <10 ; i++)
	{
		printf("%d  ", arr1[i]);
	}
	printf("\n");
	printf("输入插入的数为:");
	scanf("%d", &x);
	for (i = 0; i < 10 && arr1[i] < x; i++);

	for (int j = 9; j >= i; j--) {
		if (j + 1 < 11)
		{ 
			arr1[j + 1] = arr1[j];
		}
	}
	arr1[i] = x;
	printf("现在数组为:");
	for (int k = 0; k < 11; k++)
	{
		printf("%d  ", arr1[k]);
	}
	printf("\n");
	return 0;
}

 具体解释:

在一个已排序的整数数组 arr1 中插入一个用户输入的整数 x,并且保证插入后数组依然是有序的。接下来逐步解释代码中的每个部分。

代码解释

初始化
int arr1[11] = { 2,3,5,7,8,23,34,56,78,90 };
int i = 0;
int x = 0;

这里定义了一个包含10个元素的数组 arr1,并初始化为一些有序的值。同时定义了两个整数变量 i 和 x,其中 i 用于循环和索引,x 用于存储用户输入的数。

打印原数组
printf("原数组为:");
for ( i = 0; i < 10 ; i++) {
printf("%d ", arr1[i]);
}
printf("\n");

这段代码首先打印出“原数组为:”,然后通过一个 for 循环遍历数组 arr1 的前10个元素,并打印出来。最后打印一个换行符。

获取用户输入
printf("输入插入的数为:");
scanf("%d", &x);

这里提示用户输入一个整数,并使用 scanf 函数读取用户输入的值,存储在变量 x 中。

找到插入位置
for (i = 0; i < 10 && arr1[i] < x; i++);

这个 for 循环用于找到应该插入 x 的位置。它遍历数组 arr1 直到找到一个元素 arr1[i] 不小于 x 或者遍历完所有10个元素。注意,这里的 for 循环后面有一个分号,表示这是一个空循环体,只执行循环控制部分。

移动元素
for (int j = 9; j >= i; j--) {
if (j + 1 < 11) {
arr1[j + 1] = arr1[j];
}
}

这个 for 循环用于将位置 i 及其之后的元素向后移动一位,为插入 x 腾出空间。循环变量 j 从数组的最后一个元素位置开始递减到位置 i。条件 if (j + 1 < 11) 用于防止数组越界,确保不会尝试访问 arr1[11]

插入元素
arr1[i] = x;

在找到插入位置并移动了元素之后,将 x 插入到数组的位置 i 上。

打印新数组
printf("现在数组为:");
for (int k = 0; k < 11; k++) {
printf("%d ", arr1[k]);
}
printf("\n");

最后,打印出新的数组内容,包括新插入的元素 x。这里使用了一个新的循环变量 k 来遍历数组,避免与之前的变量 i 和 j 混淆。

总结

这段代码实现了在一个已排序的数组中插入一个新元素并保持数组有序的功能。它首先找到插入位置,然后移动元素,最后插入新元素并打印新数组。

,准备下一篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1629301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何增强交友、婚恋平台、金融等平台的安全性

运营商二要素核验是一种数字身份验证方法&#xff0c;主要使用用户的手机号码和姓名作为核验要素。这两个要素被认为是最基本的用户身份信息&#xff0c;通过运营商的数据库来核实其真实性。 在实际操作中&#xff0c;用户需要提供手机号码和姓名进行验证。应用系统会调用接口…

unity的特性AttriBute详解

unity的特性AttriBute曾经令我大为头疼。因为不动使用的法则&#xff0c;但是教程都是直接就写&#xff0c;卡住就不能继续学下去。令我每一次看到&#xff0c;直接不敢看了。 今天使用文心一言搜索一番&#xff0c;发现&#xff0c;恐惧都是自己想象的&#xff0c;实际上这个…

Docker之存储配置与管理

一、容器本地配置与Docker存储驱动 每个容器都被自动分配了本地存储&#xff0c;也就是内部存储。容器由一个可写容器层和若干只读镜像层组成&#xff0c;容器的数据就存放在这些层中。 容器本地存储采用的是联合文件系统。这种文件系统将其他文件系统合并到一个联合挂载点&a…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

Spring boot + Redis + Spring Cache 实现缓存

学习 Redis 的 value 有 5 种常用的数据结构 Redis 存储的是 key-value 结构的数据。key 是字符串类型&#xff0c;value 有 5 种常用的数据结构&#xff1a; Redis 的图形化工具 Another Redis Desktop Manager Spring Data Redis Redis 的 Java 客户端。 Spring Cache Spr…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

avl excite python二次开发1--python解释器需用内置解释器aws_cmd

avl excite python二次开发1--python解释器需用内置解释器aws_cmd 1、python解释器问题1.1、用外置python解释器&#xff0c;import WSInterface会失败(WSInterface.pyd)1.2、用内置解释器aws_cmd运行py脚本1.3 用内置解释器aws_python执行脚本三级目录 1、python解释器问题 1…

Python_AI库 matplotlib扩展知识

Python_AI库 matplotlib扩展知识 在数据分析和处理的领域里&#xff0c;可视化是一种不可或缺的手段。通过图形化的展示&#xff0c;我们可以更直观地理解数据的分布、趋势和关系。而matplotlib&#xff0c;作为Python中最为流行的数据可视化库之一&#xff0c;以其强大的功能…

Anti Rookit -- 检测隐藏进程

Anti Rookit 一&#xff1a;检测隐藏进程 引言 检测隐藏进程除了众所周知的枚举进程ID之外&#xff0c;还有枚举句柄表的方式。不过今天给大家带来的是第三种方法。 探究 应用层通过接口 C r e a t e P r o c e s s \textcolor{cornflowerblue}{CreateProcess} CreateProcess…

分布式与一致性协议之Paxos算法(二)

Paxos算法 如何达成共识 想象这样一个场景&#xff0c;某地出现突发事件&#xff0c;当地村委会、负责人等在积极研究和搜集解决该事件的解决方案&#xff0c;你也决定参与其中&#xff0c;提交提案&#xff0c;建议一些解决方法。为了和其他村民的提案做区分&#xff0c;你的…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频 - Circle 阅读助手

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础&#xff0c;引入了一系列突破性的功能&#xff0c;有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑&#xff0c;为质量…

【golang学习之旅】Go的 switch 分支语句

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】Go 的循环结构 【golang学习之旅】Go里面 if 条件判断语句 目录 系列文章switch 分支fallthrough 关键字无条件 switch switch 分支 有些时候需…

前端框架编译器之模板编译

编译原理概述 编译原理&#xff1a;是计算机科学的一个分支&#xff0c;研究如何将 高级程序语言 转换为 计算机可执行的目标代码 的技术和理论。 高级程序语言&#xff1a;Python、Java、JavaScript、TypeScript、C、C、Go 等。计算机可执行的目标代码&#xff1a;机器码、汇…

如何使用 Internet Download Manager (IDM) 来加速和优化你的下载体验 IDM 6.41下载神器

在当今信息爆炸的时代&#xff0c;下载文件和媒体内容已成为我们日常生活的一部分。无论是工作学习还是娱乐休闲&#xff0c;我们都需要从互联网上下载各种资源。为了提高下载效率和确保文件完整性&#xff0c;选择一款优秀的下载管理软件至关重要。Internet Download Manager …

四、线段、矩形、圆、椭圆、自定义多边形、边缘轮廓和文本绘制(OpenCvSharp)

功能实现&#xff1a; 对指定图片上进行绘制线段、矩形、圆、椭圆、自定义多边形、边缘轮廓以及自定义文本 一、布局 用到了一个pictureBox和八个button 二、引入命名空间 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.F…

用C实现通讯录(详细讲解+源码)

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容会给大家带来通讯录的讲解&#xff0c;主要是利用结构体来实现通讯录&#xff0c;该通讯…

【微信小程序调用百度API实现图像识别实战】-前后端加强版

前言&#xff1a;基于前面两篇图像识别项目实战文章进行了改造升级。 第一篇 入门【微信小程序调用百度API实现图像识别功能】----项目实战 第二篇 前后端结合 【微信小程序调用百度API实现图像识别实战】----前后端分离 这一篇主要讲述的是在第二篇的基础上新增意见反馈功能&a…

【35分钟掌握金融风控策略13】单维度策略监控和调优

目录 单维度策略监控和调优 策略宏观监控和调优 项目运营报表 资产监控报表 客群质量监控报表 资产使用报表 项目风险报表 FSTPD逾期报表 迁徙率报表 Vintage报表 贷后催收报表 单维度策略监控和调优 若贷前授信审批环节上线的是基于决策树开发的多维度策略&#x…

html+css 选择器优先级

1.基本选择器优先级 id>class>tagname(标签选择器)>*(通配符选择器) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>基本选择器的优先级</title><style type"text/css"…

微信小程序使用echarts实现条形统计图功能

微信小程序使用echarts组件实现条形统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;其实很简单&#xff0c;只需要简单的两步就可以实现啦&#xff0c;具体思路如下&#xff1a; 引入echarts组件调用相应的函数方法 由于需要引入echarts组件&#xff0c;代…