我正在研究计数排序算法。我已经设置了两个临时数组C
和B
。 C
用于计算原始数组中的数字出现的次数。然后,它使用C
中的元素将A
(原始数组)中的元素放入B
中的正确位置。我在每次循环后打印countingSort
函数打印C
,以确保其中包含正确的值(它确实如此,我用小样本测试它)。当我在A
的帮助下将B
的元素插入C
时,会出现此问题。
以下是我countingSort
的功能:
注意:我将10个整数2 0 3 2 5 4 3 6 10
的数组传递给函数,临时数组B
,maximum
值(所以我知道要制作的大小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] << " ";
}
}
正如您所看到的,我在每次循环后打印C
,因此在第一次循环之后,它应显示C
为0 0 0 0 0 0
,它会正确打印出来。在下一个for循环之后,C
应为2 1 2 2 1 1 1
,它也会正确打印出来。接下来,它会将C
的元素添加到get 2 3 5 7 8 9 10
,这也会正确打印出来。现在,当我尝试将A
的元素放入B
时,我的问题就出现了。它应该打印0 0 1 2 2 3 3 4 5 6
,但它会打印0 0 0 1 0 2 3 3 4 5
。
我尝试在最后一个for循环中使用我的索引,但似乎无法弄清楚导致B
错误的原因。我该如何解决这个问题?我的总体目标是让计数排序适用于随机生成的大小为40
且数字介于1到25之间的数组。
编辑:我调用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;
答案 0 :(得分:1)
myFunction[Int]("abc" -> 4 * 3) // 12
否则您将获得未定义的行为。
同样在输出数组中
for(int i = 1; i < k + 1; i++){
C[i] = C[i] + C[i - 1];
}
你的算法正确。现在只是干了一下。这样您就可以在代码中找到这些错误。
由于OP使用了for(int i = size-1; i >= 0; i--){
B[C[A[i]]] = A[i];
C[A[i]] = C[A[i]] - 1;
}
。我在答案
如果你不能使用0-indexing
使用vector ..allocate内存。请仔细检查参考。
另一件事是无论何时你编码计数排序总是试图证明你可以保持辅助数组中的范围。这有帮助。
new
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;
}
}