合并排序错误c++; 我对C++非常陌生,以前只在Python中编码过,但是Python现在对我的目的来说太慢了。我用python做了一个mergesort算法,它成功了。但是现在我把它翻译成C++,我的IDE中有很多错误。我的错误是什么 #include <iostream> using namespace std; int *sort(int lenght, int lis[]) { int units = lenght; int umt; int tiles = 1; while (units > 1) { bool whole = true; umt = units % 2; if (umt = 1) { units++; whole = false; } units = units / 2; tiles = tiles * 2; if (whole) { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = 0; int prod_r = prod_l + tiles / 2; for (int k = 0; k < units; k++) { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = k * tiles; int prod_r = prod_l + tiles / 2; for (int f = 0; f < tiles; f++) { if (lis[prod_l + add_l] <= lis[prod_r + add_r]) { buffd[f] = lis[prod_l + add_l]; add_l++; if (add_l = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_r + add_r + e]; } f = tiles; } } else { buffd[f] = lis[prod_r + add_r]; add_r++; if (add_r = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_l + add_l + e]; } f = tiles; } } } for (int i = prod_l; i < prod_l + tiles; i++) { lis[i] = buffd[i - prod_l]; } } } else { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = 0; int prod_r = prod_l + tiles / 2; for (int k = 0; k < units - 1; k++) { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = k * tiles; int prod_r = prod_l + tiles / 2; for (int f = 0; f < tiles; f++) { if (lis[prod_l + add_l] <= lis[prod_r + add_r]) { buffd[f] = lis[prod_l + add_l]; add_l++; if (add_l = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_r + add_r + e]; } f = tiles; } } else { buffd[f] = lis[prod_r + add_r]; add_r++; if (add_r = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_l + add_l + e]; } f = tiles; } } } } for (int i = prod_l; i < prod_l + tiles; i++) { lis[i] = buffd[i - prod_l]; } } } return lis; } int main() { int to_sort[8] = { 23, 1, 654, 2, 4, 87, 3, 1 }; cout << "sortiert: "; int *sorted; sorted = sort(8, to_sort); for (int p = 0; p < 8; p++) { cout << sorted[p] << " "; } return 0; } #包括 使用名称空间std; 整数*排序(整数长度,整数长度[]){ 整数单位=长度; 国际城市轨道交通; int tiles=1; 而(单位>1){ 布尔整=真; umt=单位%2; 如果(umt=1){ 单位++; 全=假; } 单位=单位/2; 瓷砖=瓷砖*2; 如果(全部){ int buffd[单位]; int add_l=0; int add_r=0; int prod_l=0; int prod_r=prod_l+tiles/2; 对于(int k=0;k栈溢出< /强”。您应该分配这些数组或使用 STD::vector < /C> > 这些本地数组声明的大小不正确:它应该是int buffd[tiles];,而不是int buffd[units]。随后会出现未定义的行为 循环的最后一个在前一个循环的主体之外,这是不正确的 当add_l或add_r等于tiles/2时,在从另一个切片复制其余元素之前,不增加f LI>在一般情况下,你的非递归算法不能成功,我得到它是为了数组长度为2的幂,它是很奇怪的,它可能是从Python版本中翻译出来的。在Python中,还有更简单的方法来编程合并代码> /Cube >,也在C++中编程。

合并排序错误c++; 我对C++非常陌生,以前只在Python中编码过,但是Python现在对我的目的来说太慢了。我用python做了一个mergesort算法,它成功了。但是现在我把它翻译成C++,我的IDE中有很多错误。我的错误是什么 #include <iostream> using namespace std; int *sort(int lenght, int lis[]) { int units = lenght; int umt; int tiles = 1; while (units > 1) { bool whole = true; umt = units % 2; if (umt = 1) { units++; whole = false; } units = units / 2; tiles = tiles * 2; if (whole) { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = 0; int prod_r = prod_l + tiles / 2; for (int k = 0; k < units; k++) { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = k * tiles; int prod_r = prod_l + tiles / 2; for (int f = 0; f < tiles; f++) { if (lis[prod_l + add_l] <= lis[prod_r + add_r]) { buffd[f] = lis[prod_l + add_l]; add_l++; if (add_l = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_r + add_r + e]; } f = tiles; } } else { buffd[f] = lis[prod_r + add_r]; add_r++; if (add_r = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_l + add_l + e]; } f = tiles; } } } for (int i = prod_l; i < prod_l + tiles; i++) { lis[i] = buffd[i - prod_l]; } } } else { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = 0; int prod_r = prod_l + tiles / 2; for (int k = 0; k < units - 1; k++) { int buffd[units]; int add_l = 0; int add_r = 0; int prod_l = k * tiles; int prod_r = prod_l + tiles / 2; for (int f = 0; f < tiles; f++) { if (lis[prod_l + add_l] <= lis[prod_r + add_r]) { buffd[f] = lis[prod_l + add_l]; add_l++; if (add_l = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_r + add_r + e]; } f = tiles; } } else { buffd[f] = lis[prod_r + add_r]; add_r++; if (add_r = tiles / 2) { for (int e = f; e < tiles; e++) { buffd[e] = lis[prod_l + add_l + e]; } f = tiles; } } } } for (int i = prod_l; i < prod_l + tiles; i++) { lis[i] = buffd[i - prod_l]; } } } return lis; } int main() { int to_sort[8] = { 23, 1, 654, 2, 4, 87, 3, 1 }; cout << "sortiert: "; int *sorted; sorted = sort(8, to_sort); for (int p = 0; p < 8; p++) { cout << sorted[p] << " "; } return 0; } #包括 使用名称空间std; 整数*排序(整数长度,整数长度[]){ 整数单位=长度; 国际城市轨道交通; int tiles=1; 而(单位>1){ 布尔整=真; umt=单位%2; 如果(umt=1){ 单位++; 全=假; } 单位=单位/2; 瓷砖=瓷砖*2; 如果(全部){ int buffd[单位]; int add_l=0; int add_r=0; int prod_l=0; int prod_r=prod_l+tiles/2; 对于(int k=0;k栈溢出< /强”。您应该分配这些数组或使用 STD::vector < /C> > 这些本地数组声明的大小不正确:它应该是int buffd[tiles];,而不是int buffd[units]。随后会出现未定义的行为 循环的最后一个在前一个循环的主体之外,这是不正确的 当add_l或add_r等于tiles/2时,在从另一个切片复制其余元素之前,不增加f LI>在一般情况下,你的非递归算法不能成功,我得到它是为了数组长度为2的幂,它是很奇怪的,它可能是从Python版本中翻译出来的。在Python中,还有更简单的方法来编程合并代码> /Cube >,也在C++中编程。,c++,mergesort,C++,Mergesort,代码中存在一些主要问题: 比较必须使用=而不是=,后者是赋值运算符 应删除buffd、add\u l、add\u r、prod\u l和prod\u r的冗余定义 许多C++编译器不支持可变长度数组定义,如 int FUDD [单元] /代码>。这些扩展是为了与C90可选的特性兼容,可能导致大数组的“强>栈溢出< /强”。您应该分配这些数组或使用 STD::vector < /C> > 这些本地数组声明的大小不正确:它应该是int buffd[tiles];,而不是int buffd[unit

代码中存在一些主要问题:

  • 比较必须使用
    =
    而不是
    =
    ,后者是赋值运算符
  • 应删除
    buffd
    add\u l
    add\u r
    prod\u l
    prod\u r
    的冗余定义
  • 许多C++编译器不支持可变长度数组定义,如<代码> int FUDD [单元] /代码>。这些扩展是为了与C90可选的特性兼容,可能导致大数组的“强>栈溢出< /强”。您应该分配这些数组或使用<代码> STD::vector < /C> >
  • 这些本地数组声明的大小不正确:它应该是
    int buffd[tiles];
    ,而不是
    int buffd[units]
    。随后会出现未定义的行为
  • 循环的最后一个
    在前一个循环的主体之外,这是不正确的
  • add_l
    add_r
    等于
    tiles/2
    时,在从另一个切片复制其余元素之前,不增加
    f
  • <> LI>在一般情况下,你的非递归算法不能成功,我得到它是为了数组长度为2的幂,它是很奇怪的,它可能是从Python版本中翻译出来的。在Python中,还有更简单的方法来编程<代码>合并代码> /Cube >,也在C++中编程。
通过一些额外的工作,我简化了您的代码并使其适用于一般情况:

#include <iostream>

using namespace std;

int *sort(int length, int lis[]) {
    for (int tile = 1; tile < length; tile += tile) {
        int tiles = tile + tile;
        int *buffd = new int[tiles];
        for (int prod_l = 0; prod_l < length; prod_l += tiles) {
            int add_l = 0;
            int max_l = tile;
            int add_r = 0;
            int max_r = tile;
            int prod_r = prod_l + max_l;
            int f = 0;
            if (prod_r >= length)
                break;
            if (prod_r + max_r > length)
                max_r = length - prod_r;
            for (;;) {
                if (lis[prod_l + add_l] <= lis[prod_r + add_r]) {
                    buffd[f++] = lis[prod_l + add_l++];
                    if (add_l == max_l) {
                        while (add_r < max_r) {
                            buffd[f++] = lis[prod_r + add_r++];
                        }
                        break;
                    }
                } else {
                    buffd[f++] = lis[prod_r + add_r++];
                    if (add_r == max_r) {
                        while (add_l < max_l) {
                            buffd[f++] = lis[prod_l + add_l++];
                        }
                        break;
                    }
                }
            }
            for (int i = 0; i < f; i++) {
                lis[prod_l + i] = buffd[i];
            }
        }
        delete[] buffd;
    }
    return lis;
}

int main() {
    int to_sort[8] = { 23, 1, 654, 2, 4, 87, 3, 1 };
    for (int i = 1; i < 8; i++) {
        cout << "sortiert: ";
        int *sorted = sort(i, to_sort);
        for (int p = 0; p < i; p++) {
            cout << sorted[p] << " ";
        }
        cout << endl;
    }
    return 0;
}
#包括
使用名称空间std;
int*排序(int-length,int-lis[]){
对于(int tile=1;tile=长度)
打破
如果(产品+最大长度)
最大长度=长度-产品长度;
对于(;;){

if(lis[prod\u l+add\u l]“我只需要有更多的文本:”不要这样做。引擎不允许你发布原因。错误之一看起来像是在<代码> > <代码> >语句中使用<代码> = <代码>。边注:关于Python和C++的唯一共同点是它们都是编程语言。不要用C++编程方式来使用Python,否则你将得到比Pythin更差的结果。为了获得C++提供的速度,你必须用C++的成语和最佳的实践来编写C++代码。;
是一个可变长度数组。它们不是。有些编译器允许使用它们,但它们是使堆栈溢出的好方法。另外请注意,您定义了四个名为
buffd
的变量,它们是不同的变量。您对其中一个变量所做的操作不会神奇地影响另一个。您在
if
之后以及在
。为什么?它们将是不同的副本。感谢你的提示1和2。提示3:如果我想要一个元素与单位一样多的数组,并且称为buffd,那么我必须使用什么来代替呢?还有:为什么你们都认为我的程序是非递归的?我有一个while循环,我还有几个for循环,程序在pyt中工作hon有这么多循环。还有:编程mergesort的最简单的方法是什么?你的算法是非递归的,因为函数
mergesort
不会递归地调用自己。你实现了一个自下而上的迭代
mergesort
,它不适合所有大小。你的pytho可能也有同样的问题n代码。@Kamelanger83如果你需要数组,但不知道数组的大小,请从开始。如果出于某种原因不允许这样做,你至少还有一个问题的材料。幸运的是,它已经被问了很多次,所以你应该能够在现有的so问题中找到帮助。非常感谢!!!我还有几个问题:为什么是这个代码是递归的,我的不是吗?for for(;)是做什么的?但是非常感谢其余的部分,帮助我更好地理解C++。
是一个永久循环,它不断迭代,直到使用
break
return
语句显式地从中断。相当于
while(true)
void mergesort(int lis[], int lo, int hi, int *tmp) {
    if (hi - lo >= 2) {
        int mid = (hi - lo) / 2;
        mergesort(lis, lo, lo + mid, tmp);
        mergesort(lis, lo + mid, hi, tmp);
        for (int i = 0; i < mid; i++)
            tmp[i] = lis[lo + i];
        for (int i = 0, j = lo + mid, k = lo; i < mid;) {
            if (j >= hi || tmp[i] <= lis[j])
                lis[k++] = tmp[i++];
            else
                lis[k++] = lis[j++];
        }
    }
}

int *mergesort(int length, int lis[]) {
    int *tmp = new int[length / 2];
    mergesort(lis, 0, length, tmp);
    delete[] tmp;
    return lis;
}