【发布时间】:2022-01-25 02:18:30
【问题描述】:
我正在为类实现排序算法,而归并排序是唯一让我难过的算法。我遇到了 seg 错误和其他问题,但是一旦我“解决”了这些问题,我现在就会坚持使用给出重复值、内存地址且未排序的数组。 代码如下:
void merge(int* array, int first, int mid, int last){
int first1 = first;
int tempArr[last + 1];
int first2 = mid + 1;
int last1 = mid;
int last2 = last;
int index = first1;
for(; (first1 <= last1) && (first2 <= last2); ++index){
if(array[first1] < array[first2]){
tempArr[index] = array[first1];
++first1;
}else {
tempArr[index] = array[first2];
++first2;
}
}
for(; first1 <= last1; ++first1, ++index){
tempArr[index] = array[first1];
}
for(; first2 <= last2; ++first2, ++index){
tempArr[index] = array[first2];
}
//assigns sorted values to original array
for(index = 0; index <= last; ++index){
array[index] = tempArr[index];
}
}
void mergeSort(int *array, int first, int last){
int mid = (first + last) / 2;
if (first < last){
mergeSort(array, first, mid);
mergeSort(array, mid+1, last);
merge(array, first, mid, last);
}
}
输入:
array[] = {99, 23, 87, 67, 34, 12, 9, 44, 67, 73, 21, 71, 65, 48, 22, 89, 5, 11, 55, 31, 61, 29, 19, 49, 51};
输出:
19 23 22 22 49 51 51 61 23 22 61 23 22 18894848128 32767 23 1889484128 32767 23 19 23 22 49 51
感谢任何帮助! p.s.这是我第一次发帖,如有格式错误,请见谅。
【问题讨论】:
-
忠告。重构您的代码以使用半开区间。它使一切变得更加简单。 stackoverflow.com/questions/13066884/…
-
我突然想到了两件事。首先,您声明临时数组的方式不是标准的。其次,仅从代码来看,您并不能保证您从临时数组中的数据的索引 0 开始,但您总是从零开始处理它。我会为函数编写测试。考虑边缘情况和奇怪的输入。调试代码的最佳方式。
-
可变大小数组是 g++ 的扩展(来自 C 的保留)。它在 C++ 中是非标准的,但如果人们使用它,它并不是世界末日。