【发布时间】:2021-07-19 10:42:57
【问题描述】:
我正在学习排序算法并尝试实现merge sort。我正在使用 C++ 编程语言。整个排序算法分为两个函数——mergeSort(将数组拆分成更小的部分)和merge(合并已经排序的数组)。请看下面我的代码
#include <iostream>
#include <vector>
void display(std::vector<int> arr)
{
for (int i = 0; i < arr.size(); ++i)
{
std::cout << arr[i] << ' ';
}
std::cout << std::endl;
}
std::vector<int> merge(std::vector<int> arr, std::vector<int> left, std::vector<int> right)
{
int k = 0, i = 0, j = 0;
while ((i < left.size()) && (j < right.size()))
{
if (left[i] <= right[j])
{
arr[k] = left[i];
++i;
}
else if (left[i] > right[j])
{
arr[k] = right[j];
++j;
}
++k;
}
while (i < left.size())
{
arr[k] = left[i];
++i;
++k;
}
while (j < right.size())
{
arr[k] = right[j];
++j;
++k;
}
return arr;
}
std::vector<int> mergeSort(std::vector<int> arr)
{
if (arr.size() < 2) return arr;
int mid = arr.size() / 2;
std::vector<int> left{};
std::vector<int> right{};
for (int i = 0; i < mid; ++i)
{
left.push_back(arr[i]);
}
for (int j = mid; j < arr.size(); ++j)
{
right.push_back(arr[j]);
}
left = mergeSort(left);
right = mergeSort(right);
merge(arr, left, right);
return arr;
}
int main()
{
std::vector<int> arr{6,2,3,1,9,10,15,13,12,17};
display(mergeSort(arr));
return 0;
}
我的代码不能正常工作,例如它返回
6 2 3 1 9 10 15 13 12 17
当我尝试排序时
6 2 3 1 9 10 15 13 12 17
但是我找不到我的错误。如果有人指出,我将不胜感激。
【问题讨论】:
-
为什么将
arr传递给merge函数?您应该从头开始构建它。 -
而且由于您是按值传递
arr而不是从merge捕获返回值,所以merge完成的所有工作都将丢失。