【发布时间】:2021-03-14 23:47:50
【问题描述】:
我不知道我是否可以在我的阵列上这样操作,或者我应该创建它的一些副本。我仍然有其他算法可以实现,这就是为什么我想在这个类中使用数组。我认为问题在于使用这个数组 ,,arr",因为当我在separate_and_merge 函数中打印值时,它们大多为0,或者是垃圾,我不知道我做错了什么。
#include <iostream>
template<typename TYPE, int SIZE>
class Array
{
private:
TYPE* arr;
public:
void DisplayArray();
void separate_and_merge(int begin, int middle, int end);
void merge_sorting(int begin, int end);
void getRandomArray();
Array();
};
template<typename TYPE, int SIZE>
Array<TYPE, SIZE>::Array()
{
arr = new TYPE[SIZE];
}
template<typename TYPE, int SIZE>
void Array<TYPE, SIZE>::separate_and_merge(int begin, int middle, int end)
{
int size_left = middle - begin + 1; //rozmair lewej podtablicy
int size_right = end - middle; // rozmiar prawej podtablicy
TYPE arr1[size_left]; // inicjacja tablic
TYPE arr2[size_right];
// podpisanie wartosci pod tablice
for (int i = 0; i < size_left; i++)
{
arr1[i] = arr[i];
}
for (int j = 0; j < size_right; j++)
{
arr2[j] = arr[j + middle + 1];
}
for (int i = 0; i < SIZE; i++)
{
}
//scalenie wartosci 2 podtablic w 1 tablice
int i = 0;
int j = 0;
int begin1 = begin; //aktualny indeks scalanej tablicy
while (i <= size_left && j <= size_right)
{
if (arr1[i] < arr2[j])
{
arr[begin1] = arr1[i];
i++;
}
else
{
arr[begin1] = arr2[j];
j++;
}
begin1++;
}
}
template<typename TYPE, int SIZE>
void Array<TYPE, SIZE>::merge_sorting(int begin, int end)
{
if (begin < end)
{
int middle = (begin + end) / 2; // srodek tablicy
merge_sorting(begin, middle);
merge_sorting(middle + 1, end);
separate_and_merge(begin, middle, end);
}
}
template<typename TYPE, int SIZE>
void Array<TYPE, SIZE>::DisplayArray()
{
for (int i = 0; i < SIZE; i++)
{
std::cout << arr[i] << std::endl;
}
}
template<typename TYPE, int SIZE>
void Array<TYPE, SIZE>::getRandomArray()
{
srand(time(NULL));
for (int i = 0; i < SIZE; i++)
{
arr[i] = std::rand();
}
}
int main() {
const int size = 10;
Array<int, size> tmp;
tmp.getRandomArray();
tmp.DisplayArray();
std::cout << std::endl << std::endl << std::endl << std::endl;
tmp.merge_sorting(0, size);
tmp.DisplayArray();
return 0;
}
【问题讨论】:
-
TYPE arr1[size_left];不是标准 C++。 Variables length arrays 仅适用于编译器扩展。 -
这个程序通过访问一个未初始化的变量表现出未定义的行为。
arr2[0]被访问但从未初始化。 -
你试过调试你的代码吗?
-
此外,程序访问
arr1[size_left]和arr2[size_right]- 这通过访问越界索引表现出未定义的行为。 -
如果您的代码格式更整齐一致,人们可能会发现提供帮助更容易。