Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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+中实现快速排序算法时出错+;:-&引用;错误:无法转换';int*';至';int**'&引用;_C++_Quicksort - Fatal编程技术网

C++ 在c+中实现快速排序算法时出错+;:-&引用;错误:无法转换';int*';至';int**'&引用;

C++ 在c+中实现快速排序算法时出错+;:-&引用;错误:无法转换';int*';至';int**'&引用;,c++,quicksort,C++,Quicksort,完整错误如下:-“|错误:无法将参数“1”的“int*”转换为“int**”转换为“void quickSort(int**,int,int)”|” 我的全部代码如下: #include <iostream> using namespace std; int Partition (int *A[], int p, int r) { int x = *A[r]; int i = p-1; for (int j=0; j<=r; j++){

完整错误如下:-“|错误:无法将参数“1”的“int*”转换为“int**”转换为“void quickSort(int**,int,int)”|”

我的全部代码如下:

#include <iostream>

using namespace std;

int Partition (int *A[], int p, int r) {
    int x = *A[r];
    int i = p-1;
    for (int j=0; j<=r; j++){
        if(*A[j]<=x){
            i++;
            int save=*A[j];
            *A[j] = *A[i];
            *A[i] = save;
        }
    }
    int save2=*A[i+1];
    *A[i+1]=*A[r];
    *A[r]=save2;
    return (i+1);
}

void quickSort(int *A[], int p, int r) {
    if (p<r){
    int q = Partition(A, p, r);
    quickSort(A, p, (q-1));
    quickSort(A, (q+1), r);
    }
}



int main() {
    int RR[] = {2,8,7,1,3,5,6,4};
    int y=sizeof(RR)/sizeof(int)-1;
    cout << y << endl;
    int *QQ = RR;
    cout << *QQ << endl;
    quickSort(QQ, 0, y);

    return 0;
}
#包括
使用名称空间std;
int分区(int*A[],int p,int r){
int x=*A[r];
int i=p-1;

对于(int j=0;j我注意到的关于代码的第一件事是大量不必要的指针解引用。
a
的内容将在不需要额外指针的情况下更改,因为数组会衰减为指针()因此,
A
被视为指向第一个数组元素的指针,您实际上已经在通过引用传递数组了

更糟糕的是,
int*A[]
不是指向
int
数组的指针,而是指向
int
的指针数组。这是一个非常不同的东西。
*A[0]
不返回2,它尝试使用2作为地址,并返回内存中地址2处发生的任何内容。这几乎肯定不是您希望看到或允许看到的任何内容,因此程序将执行一些不幸的操作。如果幸运,请崩溃

相反,试试看

int Partition (int A[], int p, int r) {
    int x = A[r];
    int i = p-1;
    for (int j=0; j<=r; j++){
        if(A[j]<=x){
            i++;
            int save=A[j];
            A[j] = A[i];
            A[i] = save;
        }
    }
    int save2=A[i+1];
    A[i+1]=A[r];
    A[r]=save2;
    return (i+1);
}

void quickSort(int A[], int p, int r) {
    cout << p << ',' << r << endl; // Bonus: This will make the next bug really easy to see
    if (p<r){
    int q = Partition(A, p, r);
    quickSort(A, p, (q-1));
    quickSort(A, (q+1), r);
    }
}
int分区(inta[],intp,intr){
int x=A[r];
int i=p-1;

对于(int j=0;j
int*A[]
vs
int*QQ
:缺少一个维度。只需阅读编译器错误消息。替代方法:重写函数,使其不需要指向数组的指针。您不需要在此处使用指针。声明
int*A[]
用于指向整数的指针数组。声明
inta[]
是一个整数数组。您是在传递整数数组还是指针数组?@user4581301我尝试重新编写函数,以便直接在其中传递数组而不是指针来进行计算。虽然错误消失了,但程序在运行时崩溃了。另外,在每个函数中声明新数组不会增加内存的使用吗应该使用指针。@Jean-François Fabre我想我明白了,我试着用int A代替int[].但和以前一样,虽然错误消失了,但它仍然崩溃了。我很遗憾,这不是我。谢谢你的回答,特别是提示,现在回到修复递归。再次感谢!@VibhuDubey另一个提示:大约1/4的路径中有一个用于Lomuto Quicksort的伪代码,我很确定这就是你正在实现的。如果你把你的东西和他们的东西进行比较,你应该在几分钟内把这些bug清除掉。我计算了5个差异/bug。也就是说,我总是发现霍尔版本更难出错。