【问题标题】:Problem in My Merge Sort Implementation C++ [closed]我的合并排序实现 C++ 中的问题 [关闭]
【发布时间】:2022-01-01 20:42:51
【问题描述】:

我一直在学习归并排序算法,但遇到了一些麻烦。在我的实现中,输出中的某些数字丢失了,而其他数字则重复了。我正在使用向量并遵循 Cormen 等人在算法简介中描述的算法。人。和Geeksforgeeks

代码如下:

#include <iostream>
#include <vector>
using namespace std;

void merge_sort(vector<int>&, int, int);
void merge(vector<int>&, int, int, int);

int main() {
    
    vector<int> A = {5, 2, 4, 6, 1, 3};
    int p = 0;
    int r = A.size() - 1;
    
    merge_sort(A, p, r);
    
    for(int num : A)
        cout << num << " ";
    
    return 0;
}

void merge_sort(vector<int>&A, int p, int r){
    if(p >= r)
        return;
    
    int mid = (p+r)/2;
    merge_sort(A, p, mid);
    merge_sort(A, mid+1, r);
    merge(A, p, mid, r);
}

void merge(vector<int>&A, int p, int mid, int r){
    int numLeft = mid - p + 1;
    int numRight = r - mid;
    
    //create two new vectors
    vector<int> left;
    vector<int> right;
    
    //copy elements over
    for(int i = 0; i < numLeft; i++)
        left.push_back(A[i]);
    for(int j = mid+1; j < (mid+1+numRight); j++)
        right.push_back(A[j]);
    
    //compare elements from the two arrays     
    int i = 0;
    int j = 0;
    int k = 0;
    
    while(i < numLeft && j < numRight){
        if(left[i] <= right[j]){
            A[k] = left[i];
            i++;
        }
        else{
            A[k] = right[j];
            j++;
        }
        k++;
    }
    //check if one half terminated before the other
    while(i < numLeft){
        A[k] = left[i];
        k++; i++;
    }
    while(j < numRight){
        A[k] = right[j];
        k++; j++;
    }
}

输出:1 2 3 6 1 3

【问题讨论】:

  • 你用过调试器吗?

标签: c++ algorithm mergesort


【解决方案1】:

您的merge 函数假定您使用p=0 进行排序。你应该从p复制,而不是从0复制。然后用kp开始放回去:

    //copy elements over
    for (int i = p; i < p + numLeft; i++)
        left.push_back(A[i]);
    for (int j = mid + 1; j < (mid + 1 + numRight); j++)
        right.push_back(A[j]);

    //compare elements from the two arrays     
    int i = 0;
    int j = 0;
    int k = p;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多