C语言 归并排序怎么老是崩溃??求大神请教,谢谢啊

如题所述

第1个回答  2024-10-29
在讨论归并排序问题时,常常遇到崩溃情况,特别是针对Merge和MSort函数。针对此问题,以下进行详细分析与修改:

首先,针对Merge函数,其核心任务是合并两个有序序列。问题可能出现在循环条件和赋值逻辑上。修改后的Merge函数如下:

代码示例:void Merge(RedType SR[], RedType TR[], int i, int m, int n) { int j, k; for(j = m - 1, k = i; i <= m && j <= n; k++) { if(LQ(SR[i].key, SR[j].key)) { TR[k] = SR[i]; i++; } else { TR[k] = SR[j]; j++; } } while (i <= m) { TR[k] = SR[i]; i++; } while (j <= n) { TR[k] = SR[j]; j++; }}

关键修改点在于循环条件的调整,以及在循环条件不满足时,将剩余元素直接加入到目标数组中。

接下来,针对MSort函数,其核心是递归地对子数组进行排序,然后合并。修改后的MSort函数如下:

代码示例:void MSort(RedType SR[], RedType TR1[], int s, int t) { int m;if(s == t) { TR1[s] = SR[s]; } else { m = (s + t) / 2; MSort(SR, TR1, s, m); MSort(SR, TR1, m + 1, t); RedType TR2[MAX_SIZE + 1]; memcpy(TR2, TR1, sizeof(RedType) * (MAX_SIZE + 1)); Merge(TR2, TR1, s, m + 1, t); }}

关键修改在于调整子数组的边界处理(特别是中间值的计算),以及使用临时数组TR2来实现归并排序。确保边界条件和元素赋值逻辑的正确性是关键。

通过以上修改,避免了归并排序过程中可能导致的崩溃问题。确保了函数的稳定性和效率。如果在实际应用中遇到其他问题,可以参照上述修改思路进行调试与优化。

C语言 归并排序怎么老是崩溃??求大神请教,谢谢啊
首先,针对Merge函数,其核心任务是合并两个有序序列。问题可能出现在循环条件和赋值逻辑上。修改后的Merge函数如下:代码示例:void Merge(RedType SR[], RedType TR[], int i, int m, int n) { int j, k; for(j = m - 1, k = i; i <= m && j <= n; k++) { if(LQ(SR[...

C语言,二路归并排序,递归调用到底是怎么调用的?求详解!
在排序每一路的时候也是使用归并的方式,把一路分成2路,层层深入。理解的话,你可以这样:比如8个数,你从上到下竖着排成一列,然后中间一条横线分割。横线上面的部分再从中间分割成2部分,2部分放在第二列;依次往后分割。得到形如这样的图:然后按照红色箭头先按A反推一层,再按B向下一层,这样...

C语言,二路归并排序求详解啊!看不懂递归啊!到底是怎么个过程?
mid = (first+last)\/2;然后会进入函数的调用,调用 merge_sort(arr, first, mid);函数,递归说白了就是反复的调用自己,知道条件不满足,跳出循环。调用merge_sort后,程序有进入到了void merge_sort(int arr[], unsigned int first, unsigned int last)不过此时无符号整形last的值就接收了midmid...

在Excel中排序时老出现“此操作要求合并单元格都具有相同大小”是什么原...
应该是有合并单元格,要不不会有提示的,楼主可以检查下嘛可以这样:CTRL+F--选项--格式--对齐--勾选“合并单元格”--“查找全部”--确定(这样操作后如果有合并单元格就会被全部找到的)。 追问 你好,我也是按照你说的这个步骤查找的,可是出来是“找不到正在搜索的数据”,也就是没有合并单元格的。还有什么其他...

C语言 参数的个数是确定的,但是参数的类型不太确定,请问怎么实现呀?很...
c,用函数指针的形式传入所需要的比较策略,比方数字大小比较函数,字符串大小比较函数之类的。这样实现可以适针对任意结构体中任意类型的字段,按照任意的比较策略来实现排序。你可以在这个排序函数中使用不同的排序算法,如插入排序\/冒泡排序\/归并排序之类的。这个问题很有意思,:) 我们会介绍给我们的同学...

相似回答
大家正在搜