它编译得很好,但是当它运行时,它会在列表中添加随机高位数,以及现有数字的重复数。我有几个人看过这个,但没有人能弄明白。
void mergeSort(int list[], int length) {
recMergeSort(list, 0, length - 1);
}
void recMergeSort(int list[], int first, int last) {
if (first < last) {
int mid = (first + last) / 2;
recMergeSort(list, first, mid);
recMergeSort(list, mid + 1, last);
merge(list, first, last, mid);
}
}
void merge(int list[], int first, int last, int mid) {
int arraySize = last - first + 1;
int* tempList = new int[arraySize];
int beginPart1 = first;
int endPart1 = mid;
int beginPart2 = mid + 1;
int endPart2 = last;
int index = beginPart1;
while (beginPart1 <= endPart1 && beginPart2 <= endPart2) {
if (list[beginPart1] < list[beginPart2]) {
tempList[index] = list[beginPart1];
beginPart1++;
}
else {
tempList[index] = list[beginPart2];
beginPart2++;
}
index++;
}
while (beginPart1 <= endPart1) {
tempList[index] = list[beginPart1];
index++;
beginPart1++;
}
while (beginPart2 <= endPart2) {
tempList[index] = list[beginPart2];
index++;
beginPart2++;
}
for (int i = first; i <= last; i++) {
list[i] = tempList[i - first];
}
delete[] tempList;
}
答案 0 :(得分:2)
在函数merge()中,您错误地计算了index
变量:
假设begin = 10,mid = 14,end = 19(对于总数组大小为0 .. 19,并且你是recMergeSort()
更高的一半),你的索引= 10,但是{ {1}}数组已编入索引tempList
(因为0..9
= arraySize
== 10)。
因此,您的last - first + 1
数组溢出,当您“合并”时,您会收到数据损坏。
将您的tempList
变量修改为0(而不是基于index
)。
答案 1 :(得分:1)
我认为问题在于:
int index = beginPart1;
应该是
int index = 0;
答案 2 :(得分:0)
如果我在C#中运行它,我会在以下行中获得IndexOutOfRangeException:
tempList[index] = list[beginPart1];
我估计如果你追踪它,你可能会在一个缓冲区的末尾运行因此随机数。