i++的错误使用

news2025/8/2 23:54:55

文章目录

    • 问题
    • 题目
    • 完整代码

问题

在执行以下代码之前,i的值为8,length的值为10。

while (i < length) {
	tempArray[i] = middle[i++];
}

我预想中的结果应该是tempArray[8] = middle[8];,然后i++
结果tempArray[8]没有被赋值:
在这里插入图片描述
反倒是tempArray[9]的值被更新了:
在这里插入图片描述
后面也是这样,当i=9时,tempArray[9]没有被赋值,反倒是tempArray[10]被赋值了。
由此可以判断,程序读取middle[i]的值后令i自增。赋值运算符的运算方向是从右到左的,此时tempArray[i]其实是tempArray[9]。
改成这样后才能得到预期的赋值结果:

while (i < length) {
	tempArray[i] = middle[i];
	i++;
}

再来说说做题时遇到的其他错误:
在for循环里把i不小心重新定于了一次,而后面还有地方要用到i的值,但是得到的肯定是0;

int i, j;
    for (int i = 1;i < length;i++)
        if (middle[i] < middle[i - 1])
            break;

把if-else语句改用为三目运算符时,忘记把if也删掉,导致程序死循环。

while (p1 < (i + mergeLength) && p2 < (i + mergeLength + mergeLength))
	if(middle[p1] > middle[p2])
        tempArray[p++] = middle[p1] > middle[p2] ? middle[p2++] : middle[p1++];

题目

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:
输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:
首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。

输入样例 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

完整代码

// 根据给出的原序列和排序中间过程的一个序列来判断是否为插入排序或者归并排序;还要输出迭代下一轮的序列
/* 归并那里有问题 */
#include<stdlib.h>
#include<stdio.h>

/* 是插入排序就返回插入位置 */
int isInsertionSort(int* original, int* middle, int length) {
    int i, j;
    for (i = 1;i < length;i++)
        if (middle[i] < middle[i - 1])
            break;
    j = i;
    for (;i < length;i++)
        if (middle[i] != original[i])
            break;
    return i == length ? j : 0;
}
void nextInsertion(int* middle, int length, int index) {
    printf("Insertion Sort\n");
    int temp = middle[index];
    int i;
    for (i = index - 1;i >= 0;i--)
        if (temp < middle[i])
            middle[i + 1] = middle[i];
        else
            break;
    middle[i + 1] = temp;
    printf("%d", middle[0]);
    for (i = 1;i < length;i++)
        printf(" %d", middle[i]);
}
/*  获得当前归并段的长度
    从头开始连续有序的子列长度是错的,例如:2 1 8 9 6 5 3 4 -> 1 2 8 9 5 6 3 4,结果是4,实际是2
    所有有序连续有序子列的最短长度也是错的,例如:
        4 2 1 3 13 14 12 11 8 9 7 6 10 5
        1 2 3 4 11 12 13 14 6 7 8 9 5 10
        最短是2,但是执行了两次,归并长度是4
    程序这里选择比较序列尾和下一段序列头
 */
int getMergeLength(int* middle, int length) {
    int mergeLength, i;
    for (mergeLength = 2;mergeLength <= length;mergeLength <<= 1) {
        for (i = mergeLength;i < length;i += mergeLength << 1)
            if (middle[i - 1] > middle[i])
                break;
        if (i < length)
            break;
    }
    return mergeLength;
}
void nextMerge(int* middle, int length) {
    printf("Merge Sort\n");
    int* tempArray = (int*)malloc(sizeof(int) * length);
    int mergeLength = getMergeLength(middle, length);
    int i, p1, p2, p = 0;

    /* 两两归并长度尾mergeLength的段 */
    for (i = 0;i < length - (mergeLength << 1);i += mergeLength << 1) {
        p1 = i, p2 = i + mergeLength;
        while (p1 < (i + mergeLength) && p2 < (i + mergeLength + mergeLength))
            tempArray[p++] = middle[p1] > middle[p2] ? middle[p2++] : middle[p1++];
        while (p1 < i + mergeLength) tempArray[p++] = middle[p1++];
        while (p2 < i + mergeLength + mergeLength) tempArray[p++] = middle[p2++];
    }
    /* 如果最后剩2段,执行归并 */
    if (length - i > mergeLength) {
        p1 = i;
        p2 = i + mergeLength;
        while (p1 < (i + mergeLength) && p2 < length)
            tempArray[p++] = middle[p1] > middle[p2] ? middle[p2++] : middle[p1++];
        while (p1 < i + mergeLength) tempArray[p++] = middle[p1++];
        while (p2 < length) tempArray[p++] = middle[p2++];
    } else {
        /* 如果剩一段 */
        while (i < length) {
            tempArray[i] = middle[i];
            i++;
        }

    }

    printf("%d", tempArray[0]);
    for (i = 1;i < length;i++)
        printf(" %d", tempArray[i]);
}
int main() {
    int index;
    int length;
    scanf("%d", &length);
    int* original = (int*)malloc(sizeof(int) * length);
    int* middle = (int*)malloc(sizeof(int) * length);
    for (int i = 0;i < length;i++)
        scanf("%d", &original[i]);
    for (int i = 0;i < length;i++)
        scanf("%d", &middle[i]);
    /* 给index赋值,同时isInsertionSort结果作为判断条件 */
    if (index = isInsertionSort(original, middle, length))
        nextInsertion(middle, length, index);
    else
        nextMerge(middle, length);
    system("pause");
    return 0;
}

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

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

相关文章

树/二叉树/森林之间的相互转换 与遍历

森林就是多棵树的集合&#xff0c;但是森林也可以只有一棵树&#xff0c;二叉树是一种特殊的树&#xff0c;固定的度为2&#xff0c;这是基本前情提要&#xff5e; 树常见的存储方式有三种&#xff1a; &#xff08;1&#xff09;双亲表示法 仅用定义一个结点对象&#xff0…

windows添加node环境

参考&#xff1a;npm和cnpm&#xff08;windows&#xff09;安装步骤_李疆~的博客-CSDN博客_cnpm一、什么是npm和cnpmnpm&#xff08;node package manager&#xff09;&#xff1a;nodejs的包管理器&#xff0c;用于node插件管理&#xff08;包括安装、卸载、管理依赖等&#…

YRCloudFile V6.9.0 加速企业在大数据应用技术创新

近日&#xff0c;焱融科技发布分布式文件存储产品 YRCloudFile 6.9.0 版本。该版本在功能和性能方面有多项技术性突破&#xff0c;主要包括大数据应用无缝对接 Hadoop &#xff0c;为大数据应用提供高性能存储平台&#xff1b;独有的 Dataload 功能和智能分层细粒度化&#xff…

查询不为空的字段

数据&#x1f4ca; idnameparent_id1党组织02陕西党委1314Null25渭南党委Null 实验⁉️ 查询int类型不为空的字段 select * from org where parent_id <> ""❌mybatis 中的 if判断会把整形中的 0 识别为false(空) select * from org where parent_id ! &quo…

体会多态的好

目录 继承和组合&#xff1a; 区别和联系 1.安全性角度&#xff08;封装性&#xff09; 2.灵活性角度&#xff08;牵一发动全身&#xff09; 多态&#xff1a; 一.怎样实现多态 1.完成向上转型 直接赋值&#xff1a;​​​​​​​ 方法传参 方法的返回值 2.完成方法重…

零基础数据科学学习 Python 的 4 个阶段

前言 如果你一直在自学 Python&#xff0c;那么你可能看过无数教程并遵循许多指南来获得这项技能&#xff0c;但是你怎么知道自己走在正确的道路上来掌握这项数据科学的基本技能&#xff1f; &#xff08;文末送读者福利&#xff09; Python 是一种实用的编程语言&#xff0c…

获取CSV文件,转成Excel格式的文件供用户从浏览器下载

前言 最近这十几天每天都很充实&#xff0c;刚完成了几个小需求&#xff1b;今天简单记录一下其中一个&#xff1a;从某系统获取csv文件&#xff0c;然后处理成可供用户在浏览器中下载的Excel文件&#xff1b; 这其中有解除到新的内容&#xff0c;也有利用项目已有的部分功能…

智慧图书馆解决方案-最新全套文件

智慧图书馆解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧图书馆全套最新解决方案合集一、建设背景 现下&#xff0c;传统图书馆已经难以适应时代的发展&#xff0c;图书盘点繁琐、管理模式落后、阅读时间和场地受限等问题&#xff0c;迫使传统图…

148. SAP UI5 表格数据如何导出成 Excel 文件(Table Export As Excel)

本教程前一步骤,我们在介绍 SAP UI5 SmartTable 时,提到了它的 Excel 导出功能。如果将 iseExportToExcel 设置为 true,就可以启用 Excel 导出功能,将 Table 控件显示的数据,导出成本地 Excel 文件。 我们仍然秉承本教程一贯从易到难的学习思路,先暂时不去碰 Smart Table…

30天消化MyBatis源码解析笔记,吊打面试官,offer接到手软

MyBatis 是一个优秀的 Java 持久化框架&#xff0c;SSM 框架组合&#xff08;Spring SpringMVC Mybatis&#xff09;&#xff0c;依赖 MyBatis 搭建的项目更是数不胜数&#xff0c;在互联网公司的使用中&#xff0c;占据了大片江山&#xff0c;你在使用 MyBatis 吗&#xff1…

嵌入式开发:RTOS调试——处理计时问题

毫无疑问&#xff0c;当你开始在嵌入式开发中使用实时操作系统(RTOS)时&#xff0c;会有一个学习曲线。你将在更高的抽象层次上工作&#xff0c;使用或多或少的并行任务&#xff0c;而不仅仅是子例程&#xff0c;并且你需要考虑你的任务应该如何彼此共享数据和处理器时间。你需…

一个系统五个场景,vivo的IoT能否以“慢”取胜?

近年来物联网声浪喧嚣尘上&#xff0c;但其实从移动互联网到IoT只有一步之遥。原因在于手机可以很好的完成“控制中枢”的作用&#xff0c;以手机为核心在IoT领域“开枝散叶”是目前行业的主流选择&#xff0c;这也是小米、华为等手机巨头在IoT领域如鱼得水、产品众多的重要原因…

企业如何防备密码攻击

在身份安全周&#xff0c;了解密码在网络安全中的重要性很有必要&#xff0c;如果您不小心&#xff0c;密码很容易被泄露。ManageEngine ADSelfService Plus如何帮助强化密码并增强企业组织安全性的呢&#xff1f; 现在是 2022 年——密码在今天仍然适用吗&#xff1f; 技术…

Docker(九)—— Docker 网络

我们之前通过端口映射实现过外部主机对容器的访问&#xff0c; 那如果想要实现两个容器之间的通信怎么办&#xff1f;用已有的经验&#xff0c;是像图中蓝色的线那样走吗&#xff1f; 一、Docker0网络 我们运行一个容器&#xff0c;进入容器内部后发现容器也有自己的IP地址。 而…

磁盘占用高问题如何排查?三步教你搞定

作者简介&#xff1a;杨嘉力&#xff0c;OceanBase开源内核高级工程师。 通常情况下&#xff0c;数据库对磁盘的占用量会随着业务的接入时间和业务数据量大增而不断上升&#xff0c;导致磁盘空间不足&#xff0c;进而发生数据无法写入、数据库无法重启等问题。这时我们就需要排…

CENTOS上的网络安全工具(十三)搬到Docker上(1)?

鉴于在集群上构建安全工具的情况越来越频繁&#xff0c;并且现在一些安全工具也提供了Docker形式的部署&#xff0c;再停留在虚拟机yum的部署方式似乎已经不太合时宜了。所以在再一次碰到一个安全工具需要使用docker安装的时候&#xff0c;我们毅然&#xff08;被逼&#xff09…

[附源码]SSM计算机毕业设计中小企业人事管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]Python计算机毕业设计安庆师范大学校园互助平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

C语言学习记录(十二)之字符串和字符串函数

文章目录一、字符串和字符串I/O1.1 定义字符串1.1.1 字符串字面量(字符串常量)1.1.2 字符串数组和初始化1.1.3 数组和指针1.1.4 数组和指针的区别二、字符串输入2.1 分配空间2.2 gets()函数 (不建议使用)2.3 gets()的替代品2.3.1 fgets()函数(和fputs())2.3.2 gets_s()函数2.3.…

【推荐算法毕业设计源码】个性化学习推荐网站的设计及实现丨可定制

登录该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍&#xff1a; 二、文档学习资料&#xff1a; 三、模块截图&#xff1a; 四、开发技术与运行环境&#xff1a; 五、代码展示&#xff1a; 六、数据库表截图&#x…