使用向量进行合并排序 (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】:

我认为您的代码可能存在四个问题。

    您假设序列&lt;start,mid&gt;&lt;mid+1,end&gt; 已排序。如果此条件不成立(例如 merge(v,0,3,2)6,5,7,4),算法将给出不正确的结果。 您在使用函数时使用了不正确的 end 值(例如,merge(v,0,4,2) 在数组 6,5,7,4 上。您总是必须迭代 &lt;0,size-1&gt;。 如前所述,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&lt;end。 使用另一种排序算法对&lt;0,mid&gt;&lt;mid+1,end&gt; 进行排序。

【讨论】:

谢谢!将 k 更改为 = 0 后似乎可以工作。这是我在 main 中使用函数的方式:vector v = 4, 2, 5, 1, 7, 3 ;合并排序(v, 0, 5); for (int i = 0; i 很高兴我能帮上忙。我注意到刚才的 mergeSort() 定义。以前没见过。在这种情况下,只有第三个问题可能是相关的。您正确使用该功能。您可以使用 C++11 方式打印数组。 for (auto i:v) cout&lt;&lt;i;【参考方案2】:

只看你的代码,我认为一个问题是kmerge函数中的初始值。

如果你把温度值放在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++的主要内容,如果未能解决你的问题,请参考以下文章

向量下标超出范围 C++ 合并排序

合并排序 - 向量不排序

C++ 合并和排序 2 个向量

C++ 合并排序分段错误?

合并排序相同的输出 C++

对未排序的向量进行合并排序