C++ C+中的递归合并排序+;

C++ C+中的递归合并排序+;,c++,sorting,recursion,merge,C++,Sorting,Recursion,Merge,我试图在C++中对合并排序进行编码,但构建它会给我一个警告:它是递归的,并且运行它会导致堆栈溢出。我不明白我哪里做错了 void mergesort(int thelist[]) { if (sizeof(thelist) <= 1) return; int middle = (sizeof(thelist) / 2); for (i = 0; i <= sizeof(thelist); i++){ if (i < middle) lf

我试图在C++中对合并排序进行编码,但构建它会给我一个警告:它是递归的,并且运行它会导致堆栈溢出。我不明白我哪里做错了

void mergesort(int thelist[]) {
  if (sizeof(thelist) <= 1)
    return;

  int middle = (sizeof(thelist) / 2);
  for (i = 0; i <= sizeof(thelist); i++){
    if (i < middle)
      lft[i] = thelist[i];
    else if (i >= middle)
      rght[i-middle] = thelist[i];
  }
  mergesort(lft);
  mergesort(rght);
  merge(lft, lft + 10, rght, rght + 10, sortedlist);
}
void合并排序(int-thelist[]{
如果(sizeof(列表)
#包括
使用名称空间std;
无效合并(int*,int*,int,int,int);
无效合并排序(int*a、int*b、int-low、int-high)
{
int轴;
如果(低<高)
{
枢轴=(低+高)/2;
合并排序(a、b、低位、枢轴);
合并排序(a、b、枢轴+1、高);
合并(a、b、低、轴、高);
}
}
无效合并(int*a、int*b、int-low、int-pivot、int-high)
{
inth,i,j,k;
h=低;
i=低;
j=枢轴+1;
而(h)
  • 如果要通过调用同一函数来处理
    int[]
    的不同部分,请尝试将函数定义为

    void mergesort(int thelist[], int start, int end)
    
  • 关于
    sizeof(列表)
    部分,如果要获得
    int[]
    的大小,需要使用

    sizeof(thelist)
    
    而不是

    sizeof(thelist)/sizeof(int)
    
    例如:

    int a[] = {1, 2, 3, 4, 5};
    int n = sizeof(a)/sizeof(int); // n=5 now
    
  • PS:您还需要仔细考虑代码逻辑并重写它。您的主要函数应该如下所示:

    void MergeSort(int data[], int start, int end)
    {
        if (start < end)
        {
            int middle = (start+end)/2;
    
            // sort for first part
            MergeSort(data, start, middle);
    
            // sort for second part
            MergeSort(data, middle+1, end);
    
            // merge both parts together
            Merge(data, start, middle, end);
        }
    }
    
    void MergeSort(int data[],int start,int end)
    {
    如果(开始<结束)
    {
    中间整数=(开始+结束)/2;
    //为第一部分排序
    合并排序(数据、开始、中间);
    //第二部分排序
    合并排序(数据,中间+1,结束);
    //将两部分合并在一起
    合并(数据、开始、中间、结束);
    }
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    无效打印arr数据(标准::矢量和arr,整数开始,整数结束){
    
    cout
    sizeof()
    并不是你认为它的意思。为什么你的代码中有
    10
    。你需要传递序列长度。
    sizeof(theist)
    没有做你认为它是什么。你的
    mergsert
    声明应该是
    void mergesort(在列表[],size\t len中)
    sizeof
    应该不在这个函数中。此外,我只能想象你正在为
    lft
    rght
    使用globals,我现在可以告诉你,它不会做你认为它会做的事情。你有一个不断结束的递归循环,如
    if(sizeof)(列表)你如何测试代码?堆栈跟踪是什么?在哪里合并?你提供的信息越多,我们就能帮助你。不幸的是,在函数的上下文中, >代码>将不起作用。(在C中,但我几乎可以肯定的是C++)这个例子在C语言中也可以使用,但问题是不清楚您是建议在被调用方中使用还是在调用方中使用;在被调用方中,它不起作用。-在调用方中,如果他像您一样声明了数组,它也会起作用。@ShinTakezou#1只是为了澄清如何正确使用
    sizeof()
    获取大小。你是对的,他/她不能把这个放在代码中,而是与#2结合在一起。因此,现在还不清楚,因为你建议用
    sizeof/sizeof
    替换
    sizeof/sizeof
    ,在我看来,你似乎建议在函数内部执行此操作。谢谢,但更多信息将非常有用。“合并”函数你需要5个与你不匹配的参数,我认为“开始”和“结束”应该是数组中的第一个和最后一个项目,但我不确定。你应该添加一些文本来解释你的代码是关于什么的,以及为什么这会回答这个问题。
    void MergeSort(int data[], int start, int end)
    {
        if (start < end)
        {
            int middle = (start+end)/2;
    
            // sort for first part
            MergeSort(data, start, middle);
    
            // sort for second part
            MergeSort(data, middle+1, end);
    
            // merge both parts together
            Merge(data, start, middle, end);
        }
    }
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    void print_arr_data(std::vector<int>& arr, int start, int end) {
        cout << "start: " << start << " end: " << end << endl;
        int len = abs(end - start) + 1;
        for(auto it = arr.begin() + start; it != arr.begin() + start + len; ++it) {
            cout << *it << ",";
        }
        cout << endl;
    }
    
    void merge(std::vector<int>& arr, int start, int end) {
        int len = abs(start - end);
        std::sort(arr.begin() + start, arr.begin() + start + len);
    }
    
    void merge_sort(std::vector<int>& arr, int start, int end) {
        // check if the array is not a unit array, then dont divide anymore
        print_arr_data(arr, start, end);
    
        if (start < end) {
            int mid = (start + end)/2;
    
            merge_sort(arr, start, mid);
            merge_sort(arr, mid+1, end);
            merge(arr, start, end);
        }
    }
    
    int main() {
        std::vector<int> data = {4,1,2,3,7,8,5,6,9};
        merge_sort(data, 0, data.size()-1);
    
        cout << "*******" << endl;
        for (int i : data) {
            cout << i << endl;
        }
        cout << "*******";
    
        return 0;
    }