c++ - int 在合并排序中引发分段错误
问题描述
我需要按每个数组的第一个元素对包含数组的数组进行排序,因为速度至关重要,我需要使用合并排序。我在 C++ 指针方面不是那么先进,所以我从网上找到的代码中拼凑了一些代码,这些代码将整数排序为适用于指针的东西:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void merge(int **Arr, int p, int m, int size)
{
int n1 = m - p + 1;
int n2 = size - m;
int **L;
int **M;
L = (int **)calloc(n1, sizeof(int *));
M = (int **)calloc(n2, sizeof(int *));
for (int i = 0; i < n1; i++)
{
L[i] = (int *)calloc(2, sizeof(int));
L[i][0] = Arr[p + i][0];
L[i][1] = Arr[p + i][1];
}
for (int j = 0; j < n2; j++)
{
M[j] = (int *)calloc(2, sizeof(int));
M[j][0] = Arr[m + 1 + j][0];
M[j][1] = Arr[m + 1 + j][1];
}
int i, j, k;
i = 0;
j = 0;
k = p;
while (i < n1 && j < n2)
{
if (L[i][0] <= M[j][0])
{
Arr[k][0] = L[i][0];
Arr[k][1] = L[i][1];
i++;
}
else
{
Arr[k][0] = M[j][0];
Arr[k][1] = M[j][1];
j++;
}
k++;
}
while (i < n1)
{
Arr[k][0] = L[i][0];
Arr[k][1] = L[i][1];
i++;
k++;
}
while (j < n2)
{
Arr[k][0] = M[j][0];
Arr[k][1] = M[j][1];
j++;
k++;
}
for (int i = 0; i < n1; i++)
{
free(L[i]);
}
for (int i = 0; i < n2; i++)
{
free(M[i]);
}
free(L);
free(M);
}
void mergesort(int **Arr, int p, int size)
{
if (p < size)
{
int m = p + int((size - 1) / 2);
mergesort(Arr, p, m);
mergesort(Arr, m + 1, size);
merge(Arr, p, m, size);
}
}
void printArray(int **Arr, int size)
{
for (int i = 0; i < size; i++)
cout << Arr[i][0] << " " << Arr[i][1] << "\n";
cout << endl;
}
int main(void)
{
int a;
cin >> a;
int **arr1 = (int **)calloc(a, sizeof(int *));
for (int i = 0; i < a; i++)
{
int n1, n2;
arr1[i] = (int *)calloc(2, sizeof(int));
cin >> n1;
cin >> n2;
arr1[i][0] = n1;
arr1[i][1] = n2;
}
cout << "Unsorted arr:\n";
printArray(arr1, a);
mergesort(arr1, 0, a - 1);
cout << "Sorted arr:\n";
printArray(arr1, a);
for (int i = 0; i < a; i++)
{
free(arr1[i]);
}
free(arr1);
return 0;
}
根据 VSC 中的调试器,int m = p + int((size - 1) / 2);
当尝试一次传入超过 4 个元素时,我在第 84 行 () 上遇到分段错误。
如果有用:正确的输入/输出:
3
5 4
2 1
3 2
Unsorted arr:
5 4
2 1
3 2
Sorted arr:
2 1
3 2
5 4
输出错误:
5
5 4
3 2
1 8
4 9
10 15
Unsorted arr:
5 4
3 2
1 8
4 9
10 15
然后程序退出。
解决方案
推荐阅读
- matplotlib - 为什么将 seaborn 重绘的“种类”从“散布”更改为“线”会使时间序列出现错误?
- mysql - SQL中重复字符串的子字符串索引
- branch.io - 在 Web 集成中将 $mixpanel_distinct_id 传递给 Branch.io
- php - Moodle 课程 ID 始终等于 1
- php - Curl GET 请求将我重定向到一个页面以选择位置
- openwhisk - 使用 incubator-openwhisk-devtools 安装 openwhisk 时出现问题
- firebase - 如何修复在 Navcontroller ionic 中找不到推送
- python - python 正则表达式从文本中省略复杂的引用样式
- sql - 在 SQL 中为迭代创建行
- visual-studio - 在代码中读取 C++ 中的静态文件