使用向量进行合并排序 (int) C++
Posted
技术标签:
【中文标题】使用向量进行合并排序 (int) C++【英文标题】:Merge Sort Using Vectors (int) C++ 【发布时间】:2016-01-29 03:41:49 【问题描述】:我似乎无法弄清楚我的代码有什么问题。正如标题所说,我正在尝试使用整数向量实现归并排序。
标题:
using Val = int;
using Container = std::vector<Val>;
using Iter = long;
void mergeSort(Container& arr, Iter start, Iter end);
.CPP(我已经在文件中包含了merge的定义,只是这里没有画出来)
void mergeSort(Container& arr, Iter start, Iter end)
if (start >= end) return;
int mid = (start + end) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, end, mid);
void merge(Container& arr, Iter start, Iter end, Iter mid)
int len = end - start + 1;
int x = 0;
Container temp;
temp.resize(arr.size());
int i, j, k;
i = start;
k = start;
j = mid + 1;
while (i <= mid && j <= end)
if (arr[i] < arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
while (i <= mid) temp[k++] = arr[i++];
while (j <= end) temp[k++] = arr[j++];
for (k = 0; k < len; k++) arr[k + start] = temp[k];
非常感谢!
【问题讨论】:
输出是什么?什么是预期的输出?您认为错误出现在代码的哪个区域? 您是否尝试过在调试器中逐行执行代码? 【参考方案1】:我认为您的代码可能存在四个问题。
-
您假设序列
<start,mid>
和<mid+1,end>
已排序。如果此条件不成立(例如 merge(v,0,3,2)
对 6,5,7,4
),算法将给出不正确的结果。
您在使用函数时使用了不正确的 end
值(例如,merge(v,0,4,2)
在数组 6,5,7,4
上。您总是必须迭代 <0,size-1>
。
如前所述,k 应始终初始化为 0。您希望将已排序的序列插入到已排序数组的开头。
您假设参数 mid 是数组中元素的index
,而不是position
。例如merge(v,0,3,2)
将在1,6,2,4
上产生不正确的结果,因为在函数中,您将序列从索引mid+1=2+1=3
排序到3
,其中仅包含4
。因此,您的第一部分 1,6,2
未排序,这是您的算法所要求的。
解决办法是:
-
将 k 初始化为 0。
检查是否
mid<end
。
使用另一种排序算法对<0,mid>
和<mid+1,end>
进行排序。
【讨论】:
谢谢!将 k 更改为 = 0 后似乎可以工作。这是我在 main 中使用函数的方式:vectorfor (auto i:v) cout<<i;
【参考方案2】:
只看你的代码,我认为一个问题是k
在merge
函数中的初始值。
如果你把温度值放在Container temp
中,从位置0
开始,那么你应该将k
初始化为0
k = 0;
或者如果你想要从start
开始的位置,那么你需要将最后一个for
循环更改为
for (k = start; k <= end; k++) arr[k] = temp[k];
但是,请发布有关您遇到的问题的更多信息。它是编译错误吗?或运行时错误?还是结果与您的期望不符?另外,请展示您为解决问题所做的工作:)
【讨论】:
我编译了,没有错误。也没有运行时错误(正确使用时)。我认为错误不在于 OP 提供的实现(如您所说的 k=0 问题除外),而在于函数的错误使用。 @Slazer 我同意你的看法......该功能的使用方式可能存在问题。至少如果 OP 可以提供更多信息,比如函数的使用方式和输入是什么样的,至少会更清楚...... 谢谢!我将其更改为 k=0 ,现在似乎运行良好。这是截图:prntscr.com/8wshjz。我不确定我是否理解右下角的错误。 @user5056973 很好用。 PDB 文件可帮助您调试 DLL,如果没有它们,则无法设置断点以单步执行对应的 DLL。有关详细信息,我认为您可以参考一些很好的解释 Cannot find or open the PDB file in Visual Studio C++ 2010 和 Error Message : Cannot find or open the PDB file :)以上是关于使用向量进行合并排序 (int) C++的主要内容,如果未能解决你的问题,请参考以下文章