使用矢量合并排序(int)C++

Merge Sort Using Vectors (int) C++

本文关键字:int C++ 排序 合并      更新时间:2023-10-16

我似乎不知道我的代码出了什么问题。正如标题所说,我正在尝试使用整数向量实现合并排序。

标头:

using Val = int;
using Container = std::vector<Val>;
using Iter = long;
void mergeSort(Container& arr, Iter start, Iter end);

.CPP(我已经在文件中包含了合并的定义,只是这里没有图片)

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

解决方案是:

  1. 将k初始化为0
  2. 检查mid<end
  3. 使用另一种排序算法对<0,mid><mid+1,end>进行排序

只看您的代码,我认为有一个问题是merge函数中k的初始值。

如果将temp值从位置0开始放入Container temp,则应将k初始化为0

k = 0;

或者,如果您希望位置从start开始,则需要将最后一个for循环更改为

for (k = start; k <= end; k++) arr[k] = temp[k];

但是,请发布有关您遇到的问题的更多信息。。这是编译错误吗?还是运行时错误?或者结果与你的预期不符?此外,展示您为解决问题所做的工作:)