在c ++中实现quickSort算法时出错: - “错误:无法将'int *'转换为'int **'.....”

时间:2016-10-18 20:37:24

标签: 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++){
        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;
}

这是我从伪代码尝试自己的实现。我是编程新手,所以如果你能说明一下这个错误发生的原因,那将是一个很大的帮助。

提前致谢

1 个答案:

答案 0 :(得分:0)

我注意到代码的第一件事是大量不必要的指针解除引用。 A的内容将在不需要额外指针的情况下进行更改,因为数组会衰减为指针(What is array decaying?),因此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);
    }
}

请注意cout顶部的额外quickSort语句。这有助于您查看Partition中的逻辑错误。该计划将因......等待而崩溃!堆栈溢出,但cout将显示原因。