Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自下而上合并排序_C++_Mergesort - Fatal编程技术网

C++ 自下而上合并排序

C++ 自下而上合并排序,c++,mergesort,C++,Mergesort,我有下面的自下而上的mergesort代码,它在文件上执行它的操作m-by-m merges在每次传递时加倍m这里是代码 #include <iostream> #include <vector> using namespace std; inline int Min(int a,int b) { return a<b?a:b; } void merge(int a[],int l,int m,int r) { vector<int>

我有下面的自下而上的mergesort代码,它在文件上执行它的操作m-by-m merges在每次传递时加倍m这里是代码

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

inline int Min(int a,int b)
{
    return a<b?a:b;
}

void merge(int a[],int l,int m,int r)
{
    vector<int>b;
    int i, j;
    for (i=m+1;i>=l;i--)  b[i-1]=a[i-1];
    for (j=m;j<r;j++) b[r+m-j]=a[j+1];
    for (int k=l;k<=r;k++)
        if ( b[j]<b[i]) 
            a[k]=b[j--];  
        else
            a[k]=b[i++];
}

void mergesort(int a[],int l,int r)
{
    for (int m=1;m<=r-l;m=m+m)
        for (int i=l;i<=r-m;i+=m+m)
            merge(a,i,i+m-1,Min(i+m+m-1,r));
}

int main()
{
    int a[]={12,4,7,3,9,8,10,11,6};
    int n=sizeof(a)/sizeof(int);
    mergesort(a,0,n-1);
    for (int i=0;i<n;i++)
    {
        cout<<a[i]<< "  ";
    }

    return 0;
}
#包括
#包括
使用名称空间std;
内联整数最小值(整数a、整数b)
{
返回a=l;i--)b[i-1]=a[i-1];

对于(j=m;j您将
b
创建为空向量,然后开始对其元素进行寻址。它的大小为0,因此这是无效的。您应该给它一个更大的大小。

您没有初始化向量以在其中包含任何数据

我想这是一个练习,这就是你为什么要重新发明轮子的原因。我不确定这是否是使用单字符标识符的借口,这会使你的代码很难理解

如果a是一个数组,l是它的长度,你可以用

vector<int> b( a, a+l );
向量b(a,a+l);
您可能正在创建阵列的临时克隆以进行排序

顺便说一句,mergesort不是递归的吗?我看你的不是


我对您的代码也有其他问题,例如您的缩进表明for循环是嵌套的,但与for语句在同一行上的语句后面的分号表明不是这样。我建议您始终在循环上使用大括号。

在function
merge
中,您有
vectorb;
b的大小为0。Y你应该
rezise()
你的向量,或者用数组初始化它:

vector<int> v(arr, arr+size);
向量v(arr,arr+大小);

其他人已经解决了您在尝试为空向量中的元素编制索引时遇到的问题。此外,以下循环存在问题:

for (i=m+1;i>=l;i--)  b[i-1]=a[i-1];

循环的最后一次迭代有
i=l
,您可以处理向量/数组的
[i-1]
元素。当
l=0
时,这是索引
-1
,将超出向量和数组的范围。

这就是“自底向上”的含义暗示:它是循环递归而不是调用递归。异常来自哪一行?您试图访问的元素是什么,您认为向量有多大?此时您的调用堆栈有多深?索引是否超出范围,i、j或k?老实说,@user466441,您的大多数问题都是“这里有一堆代码,请帮忙”,您没有提供任何信息,也没有付出任何努力。我为您重新格式化了代码。但是,更一致的格式仍然无法修复您糟糕的变量名、不一致的括号使用和语句单行。