【发布时间】:2017-01-19 15:54:44
【问题描述】:
我尝试实现归并排序算法,但出现分段错误。为什么?错误似乎在 MergeSort 函数中。合并排序函数(在第 2 次调用时)应仅检查 4 个数字的数组(长度应为 4)显示长度 = 27。为什么? (在一个有 8 个元素的数组上测试)
#include<iostream>
using namespace std;
int n, A[1000];
void citire(int lungime) {
for (int i = 0; i < lungime; i++) cin >> A[i];
}
void afisare(int lungime) {
for (int i = 0; i < lungime; i++)
cout << A[i] << " ";
cout << '\n';
}
int lungime(int A[]) {
int i = 0;
while (A[i]) i++;
return i;
}
void Merge(int L[], int R[], int A[]) {
int nL = lungime(L);
int nR = lungime(R);
int i = 0, j = 0, k = 0;
while (i < nL && j < nR) {
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
k++;
}
while (i < nL) {
A[k] = L[i];
i++;
k++;
}
while (j < nR) {
A[k] = R[j];
j++;
k++;
}
}
void MergeSort(int A[]) {
int n1 = lungime(A);
if (n1 < 2) return;
else
{
int mid = (int)n1 / 2;
int L[mid];
int R[n - mid];
for (int i = 0; i < mid; i++)
L[i] = A[i];
for (int i = mid; i < n; i++)
R[i - mid] = A[i];
MergeSort(L);
MergeSort(R);
Merge(L, R, A);
}
}
int main() {
cin >> n;
citire(n);
MergeSort(A);
afisare(n);
return 0;
}
【问题讨论】:
-
听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。延伸阅读:How to debug small programs
-
我知道,但我已更改为 OSx 开发环境,但我的调试器无法正常工作,我不知道为什么。我会设置它,但也许我会在我完成调试器设置之前在这里找到答案
-
“因为我是 OSx c++ 编译器的新手,无法调试代码”听起来像是学习的绝佳机会!
-
好点在这里
-
while (A[i]) i++;将溢出您的缓冲区A除非它以空值终止,但不能保证会这样。
标签: c++ algorithm segmentation-fault mergesort