Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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++_Sorting_Counting Sort - Fatal编程技术网

C++ 使用计数排序无法获取正确的排序数组

C++ 使用计数排序无法获取正确的排序数组,c++,sorting,counting-sort,C++,Sorting,Counting Sort,我目前正在研究计数排序算法。我已经设置了两个临时数组C和BC是计算原始数组中某个数字出现的次数。然后,它使用C中的元素将A(原始数组)中的元素放置到B中的正确位置。我让我的countingSort函数在每个循环后打印出来C,以确保它包含正确的值(它确实如此,我正在用小样本量测试它)。当我在C的帮助下将A的元素插入B时,就会出现问题 这是我的countingSort函数: int sizeCount1 = 10; int countOne[10] = {2, 0, 3, 2, 5, 4, 3 ,6

我目前正在研究计数排序算法。我已经设置了两个临时数组
C
B
C
是计算原始数组中某个数字出现的次数。然后,它使用
C
中的元素将
A
(原始数组)中的元素放置到
B
中的正确位置。我让我的
countingSort
函数在每个循环后打印出来
C
,以确保它包含正确的值(它确实如此,我正在用小样本量测试它)。当我在
C
的帮助下将
A
的元素插入
B
时,就会出现问题

这是我的
countingSort
函数:

int sizeCount1 = 10;
int countOne[10] = {2, 0, 3, 2, 5, 4, 3 ,6, 1, 0};

cout << "Counting Sort Version 1 (Pre Sort)" << endl;

for(int i = 0; i < sizeCount1; i++){
    cout << countOne[i] << " ";
}

cout << endl;


for(int i = 0; i < sizeCount1; i++){
    countTemp[i] = 0;
}



int max = 0;
for(int i = 0; i < sizeCount1; i++){
    if(countOne[i] > max){
        max = countOne[i];
    }
}

cout << "Max: " << max << endl;


countingSort(countOne, countTemp, max, sizeCount1);

cout << endl;

cout << "Counting Sort Version 1 (Post Sort)" << endl;


for(int i = 1; i < 10; i++){
    cout << countTemp[i] << " ";
}

cout << endl << endl;
注意:我将一个包含10个整数的数组
2 0 3 2 5 4 3 6 10
传递给函数、临时数组
B
最大值(因此我知道数组
C
的大小)和数组
A

void countingSort(int A[], int B[], int k, int size){
    int C[k + 1];
    cout << "K: " << k << endl;

    for(int i = 0; i < k + 1; i++){
        C[i] = 0;
    }



    for(int i = 0; i < k + 1; i++){
        cout << C[i] << " ";
    }


    for(int i = 0; i < size; i++){
        C[A[i]] = C[A[i]] + 1;
    }

    cout << endl;


    for(int i = 0; i < k + 1; i++){
        cout << C[i] << " ";
    }


    for(int i = 0; i < k + 1; i++){
        C[i] = C[i] + C[i - 1];
    }


    cout << endl;
    for(int i = 0; i < k + 1; i++){
        cout << C[i] << " ";
    }



    for(int i = size + 1; i > 0; i--){
        B[C[A[i]]] = A[i];
        C[A[i]] = C[A[i]] - 1;
    }


    cout << endl;
    for(int i = 0; i < size; i++){
        cout << B[i] << " ";
    }


}
你的算法是对的。现在就试一下。这样,您就可以在代码中找到此类错误

由于OP使用了
0-索引
。我在回答中使用了同样的方法

如果无法使用vector..请使用
new
分配内存。为此,请检查参考位

另一件事是,无论何时进行代码计数排序,都要尝试证明可以在辅助数组中保持范围。这很有帮助

计数排序代码:
void countingSort(int A[],int B[],int k,int size){
int C[k+1];
对于(int i=0;i=0;i--){
B[C[A[i]]=A[i];
C[A[i]]=C[A[i]]-1;
}
}
主代码
int-sizeCount1=10;
int countOne[10]={2,0,3,2,5,4,3,6,1,0};

请回答您的问题并提供一个.int C[k+1]不是合法的C++。没有VLA。您可能想改用std::vector。我被限制使用不可更改的向量被限制使用向量但不被限制使用非标准的非可移植结构?您正在学习一门有趣的课程(从昆虫学的角度来看)。因此我更改了该部分,仍然得到了相同的输出,但是我确实将最后一个for循环更改为
for(int i=size;i>=0;i++)
我得到了
0 0 0 0 0 1 2 3 3 4 5
这很接近,但它在开头有一个额外的0,而不是结尾的6。@zsloan112.:
I=size-1
你已经多迭代了一次,这就是为什么要多加一个0。当我把它改成
i=size-1
for(int i=size-1;i>=0;i--)
时,我得到了一个分段fault@zsloan112.:您应该减小
i
。检查
(inti=size-1;i>=0;i--)
这就是我所拥有的:
(inti=size-1;i>=0;i--)
for(int i = 1; i < k + 1; i++){
    C[i] = C[i] + C[i - 1];
}
for(int i = size-1; i >= 0; i--){
    B[C[A[i]]] = A[i];
    C[A[i]] = C[A[i]] - 1;
}
void countingSort(int A[], int B[], int k, int size){
    int C[k + 1];
    for(int i = 0; i < k + 1; i++){
        C[i] = 0;
    }
    for(int i = 0; i < size; i++){
        C[A[i]] = C[A[i]] + 1;
    }
    for(int i = 0; i < k + 1; i++){
        C[i] = C[i] + C[i - 1];
    }
    for(int i = size-1; i >= 0; i--){
        B[C[A[i]]] = A[i];
        C[A[i]] = C[A[i]] - 1;
    }
}
int sizeCount1 = 10;
int countOne[10] = {2, 0, 3, 2, 5, 4, 3 ,6, 1, 0};

cout << "Counting Sort Version 1 (Pre Sort)" << endl;

for(int i = 0; i < sizeCount1; i++){
    countTemp[i] = 0;
}
int max = 0;
for(int i = 0; i < sizeCount1; i++){
    if(countOne[i] > max){
        max = countOne[i];
    }
}

cout << "Max: " << max << endl;


countingSort(countOne, countTemp, max, sizeCount1);
cout << "Counting Sort Version 1 (Post Sort)" << endl;
for(int i = 0; i < 10; i++){
    cout << countTemp[i] << " ";
}

cout << endl << endl;