我试图用C ++编写Mergesort。
到目前为止我有两个函数,MergeSort函数接受输入并调用split函数。
void Split(const std::vector<int>& input, std::vector<int>* output1, std::vector<int>* output2) {
std::cout << "In split function" << std::endl;
for (int i = 0; i < input.size(); i++) {
std::cout << input[i] << ", ";
}
std::cout << std::endl;
if (input.size() > 1) {
int i = 0;
int j = input.size() - 1;
while (i < j) {
output1->push_back(input[i]);
i++;
output2->push_back(input[j]);
j--;
}
std::vector<int> left= {};
std::vector<int> right = {};
std::vector<int> *left_ptr = &left;
std::vector<int> *right_ptr = &right;
Split(*output1, left_ptr, right_ptr);
Split(*output2, left_ptr, right_ptr);
}
}
void MergeSort(std::vector<int>* input){
std::vector<int> output1= {};
std::vector<int> output2 = {};
std::vector<int> *ptr1 = &output1;
std::vector<int> *ptr2 = &output2;
std::cout << "Starting mergesort" << std::endl;
Split(*input, ptr1, ptr2);
}
我还有一个我没有包含的合并功能。
如您所见,我创建了两个列表,初始列表将拆分为。然后我将指向这些列表的指针传递给split函数。
我知道有更简单的方法可以做到这一点,但这是一项家庭作业,所以功能签名必须保持不变。
以下是我使用此代码获得的输出的一部分:
In split function
3, 4,
In split function
3,
In split function
4,
In split function
1, 2,
In split function
3, 1,
In split function
3,
In split function
1,
In split function
4, 2,
这种情况持续不断。
然后我稍微更改了代码。我没有直接指向地址空间的指针,而是直接制作了指针。
例如,这是我对mergesort函数所做的:
void MergeSort(std::vector<int>* input){
std::vector<int> *output1= {};
std::vector<int> *output2 = {};
std::cout << "Starting mergesort" << std::endl;
Split(*input, output1, output2);
}
现在输出的是:
Starting mergesort
In split function
3, 5, 1, 2, 9, 4,
Segmentation fault (core dumped)
这两种实现有什么区别?每个人都在发生什么?我如何使这项工作?