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

Posted

技术标签:

【中文标题】合并排序相同的输出 C++【英文标题】:Merge sort same output C++ 【发布时间】:2020-05-20 12:19:48 【问题描述】:

我为合并排序编写了以下代码,但它不起作用,而且我无法找出问题! 每次输出与输入相同时,我认为由于矢量引用可能会出现问题。 我认为 mergeSort 没有为子数组创建新向量。但我仍然很困惑。

输入向量:5, 4, 3, 2, 1 输出:5, 4, 3, 2, 1 请求输出:1, 2, 3, 4, 5

#include <iostream>
#include <vector>

using namespace std;

void merge(vector<int> &la, vector<int> &ra, vector<int> &A) 

    int i = 0, j = 0, k = 0;

    //  overwriting A using its solved sub arrays i.e la, ra
    while (i < la.size() && j < ra.size()) 
        if (la[i] <= ra[j]) 
            A[k] = la[i];
            i++;
            k++;
         else 
            A[k] = ra[j];
            j++;
            k++;
        
    

    //  if any subarray left then
    while (i < la.size()) 
        A[k] = la[i];
        k++;
        i++;
    
    while (j < ra.size()) 
        A[k] = ra[j];
        k++;
        j++;    
    

合并排序函数:

void mergeSort(vector<int> &A) 

    if (A.size() < 2)
        return;

    int len = A.size();
    vector<int> la, ra;

    for (int i = 0; i < len / 2; i++)
        la.push_back(A[i]);

    for (int i = len / 2; i < len; i++)
        ra.push_back(A[i]);

    //  dividing the proble into subproblem
    mergeSort(la);
    mergeSort(ra);

    //  merging the solved subproblem
    merge(la, ra, A);

驱动功能:

int main(void) 
    int arr[] =  5, 4, 3, 2, 1 ;
    vector<int> A(arr, arr + 5);
    for (int i = 0; i < A.size(); i++)
        cout << A[i] << " ";
    cout << endl;

    mergeSort(A);

    for (int i = 0; i < A.size(); i++)
        cout << A[i] << " ";
    return 0;

【问题讨论】:

您将复制向量传递给mergeSortmerge。而是通过引用 (&amp;) 传递它们。 尝试为你的问题写更清晰的标题,让每个人都能找到他们的问题。 @Botje 我也尝试过传递引用,但它仍然无法正常工作。 “不工作”是一个无用的诊断。编辑您的代码以使用引用并向我们展示您观察到和预期会发生的情况。 @Botje 我已经对我的代码进行了更改,您可以看到,它仍然给出相同的输出。 【参考方案1】:

贴出来的代码好像没有问题。

执行它会产生预期的输出:1 2 3 4 5,所以还有其他一些事情可能会引起您的观察:您可能正在运行由先前版本或至少不同版本的代码生成的可执行文件。

【讨论】:

以上是关于合并排序相同的输出 C++的主要内容,如果未能解决你的问题,请参考以下文章

合并排序代码中的分段错误

合并排序的合并操作不使用 C++ 向量

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

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

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

归并排序算法问题:不同的输出