计数排序给出错误的结果
counting sort gives wrong results
计数排序总是给出不正确的结果,总是以前导 0 和缺少最后一个数字,即给定输入 9、8、7、6、5,它会给出 0、5、6、7、8。
我的逻辑:
- 使用 C 作为数字 0-9 的存储桶
- 通过 C[A[i]] = C[A[i]] + 1 对源数组 A 中的项目进行计数
- 遍历 C 中的所有存储桶并将所有项目 <= 当前存储桶相加,以找到 A[i] 的正确位置 将 C 中的
- 项目复制到输出数组 B,记住每次复制时递减 C 中的存储桶
顺便说一句,之前用于提问的相同代码,但这是一个不同的问题
#include <iostream>
#define MAX 10
int main(void){
int A[MAX] = {9, 3, 9, 3, 9, 3, 0, 0, 9, 3};
int C[10];
int B[MAX] = {0};
for (int i = 0; i < 10; i++) C[i] = 0;
std::cout << "nOriginal array = ";
for (int i = 0; i < MAX; i++) std::cout << " " << A[i] << " ";
std::cout << "n";
// increment count of buckets containing this digit accordingly
for (int i = 0; i < MAX; i++) C[A[i]] = C[A[i]] + 1;
// count all count <= the current bucket to determine the correct index
for (int i = 1; i < 10; i++) C[i] = C[i] + C[i-1];
// copy array elements to output array B and decrement C array accordingly
for (int i = MAX-1; i >= 0; i--){
B[C[A[i]]] = A[i];
C[A[i]] = C[A[i]]-1;
}
std::cout << "nSorted array = ";
for (int i = 0; i < MAX; i++) std::cout << " " << B[i] << " ";
std::cout << "n";
return 0;
}
结果总是错误的,前导 0 作为第一个元素,并且总是缺少最后一个元素。
正如Jarod42所说,您的问题是 C 中的数组从索引 [0] 开始,因此您获得答案数组 B 的索引不正确。简单修复:
// copy array elements to output array B and decrement C array accordingly
for (int i = MAX - 1; i >= 0; i--) {
// B[C[A[i]]] = A[i]; // Wrong
B[C[A[i]] - 1] = A[i]; // Right
C[A[i]] = C[A[i]] - 1;
}
相关文章:
- 如何修复循环中的错误产生的错误结果?
- 添加可变参数函数的错误结果
- 使用特征 3 线性系统求解器的错误结果
- 按位包含 OR 的错误结果
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- STD :: FPCLASSIFY的错误结果使用Valgrind进行长时间的双重双重结果
- 视觉工作室的错误结果
- 将C#struct传递给C 不受管理的DLL返回错误结果
- 最长的常见子字错误结果
- 华氏度到摄氏度的错误结果
- UE4中简单坐标变换的错误结果
- 记忆错误结果的说明[编译器行为]
- 如何解决错误PRJ0002:错误结果 -1073741515从"cl.exe"返回?
- 错误 PRJ0002:错误结果 -1073741515 从"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.
- glGetUniformLocation OpenGL ES 2.0(在ipad 3 iOS 7.0.3上返回错误结果)
- 在模板函数中调用std::for_each时出现错误结果
- 使用copy和back_inserter将矢量附加到其自身时出现错误结果
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 来自 c++ 代码的错误结果
- 使用浮点值和铸造的算术运算的错误结果 - 差异很大,我想这不是准确值的情况(429497)?