i++的错误使用
创始人
2024-01-30 16:28:18

文章目录

    • 问题
    • 题目
    • 完整代码

问题

在执行以下代码之前,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
#include/* 是插入排序就返回插入位置 */
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];elsebreak;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 51 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);elsenextMerge(middle, length);system("pause");return 0;
}

相关内容

热门资讯

长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
1秒多少毫秒 1秒等于多少毫秒... 长度单位换算1丈=10尺;1尺=10寸;1寸=10分;1分=10厘;1丈≈3.33米;1尺≈3.33...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
中国电信人工电话多少 中国电信... 当我们在使用中国移动、中国电信和中国联通提供的电信业务时,可能会发生争议。建议直接向服务提供商投诉,...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...