【问题标题】:Merge Sort Using Vectors (int) C++使用向量进行合并排序 (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];

}

非常感谢!

【问题讨论】:

  • 输出是什么?什么是预期的输出?您认为错误出现在代码的哪个区域?
  • 您是否尝试过在调试器中逐行执行代码?

标签: c++ vector int mergesort


【解决方案1】:

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

  1. 您假设序列&lt;start,mid&gt;&lt;mid+1,end&gt; 已排序。如果此条件不成立(例如 merge(v,0,3,2){6,5,7,4}),算法将给出不正确的结果。
  2. 您在使用函数时使用了不正确的 end 值(例如,merge(v,0,4,2) 在数组 {6,5,7,4} 上。您总是必须迭代 &lt;0,size-1&gt;
  3. 如前所述,k 应始终初始化为 0。您希望将已排序的序列插入到已排序数组的开头。
  4. 您假设参数 mid 是数组中元素的index,而不是position。例如merge(v,0,3,2) 将在{1,6,2,4} 上产生不正确的结果,因为在函数中,您将序列从索引mid+1=2+1=3 排序到3,其中仅包含{4}。因此,您的第一部分 {1,6,2} 未排序,这是您的算法所要求的。

解决办法是:

  1. 将 k 初始化为 0。
  2. 检查是否mid&lt;end
  3. 使用另一种排序算法对&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++ 2010Error Message : Cannot find or open the PDB file :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2023-03-15
  • 2016-07-22
  • 2020-08-03
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多