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;