计数排序输出问题:读取访问冲突

Counting sort output problem: read access violation

本文关键字:读取 访问冲突 出问题 输出 排序      更新时间:2023-10-16

我正在尝试计算排序算法。程序在使用调试器时运行,但问题是它输出的内容。输出值在视觉工作室中为 -842150451。我不确定为什么我会得到这个值。我也得到了这个弹出窗口:

"引发未处理的异常:读取访问冲突。
C是0x34B6F822。发生了">

我做错了什么?

这是代码

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector> 

using namespace std;
void count(int A[], int B[], int k, int n) {

int i;
int j;
int* C = new int[k];

for (i = 0; i < k+1; i++) {
C[i] = 0;
}
for (j = 1; j <= n; j++) {
C[A[j]]++; // this is where the 0x34B6F822 error is
}
for (i = 1; i <= k; i++) {
C[i] +=  C[i - 1];
}
for (j = n; j >= 1; j--) {
B[C[A[j]]] = A[j];
C[A[j]] = C[A[j]] - 1;
}

}

int main()
{
int A[] = { 6,5,8,4,3 };
int n = sizeof(A) / sizeof(*A);
int k = 0;
for (int i = 0; i < n; i++) {
if (A[i] > k)
k = A[i];
}

int* B = new int[n];
int j;
for (j = 0; j < n; j++)
printf("%d ", B[j]);
printf("n");
count(A, B, k, n);

return 0;
}

C 有 k 个元素,索引从 0 到 k - 1。但是,A 中的最大值等于 k。因此,在某些时候,您正在访问 C[k],它指向您不拥有的内存。

你的代码中有两个问题。

第一:数组C较小,只能存储从0k-1k元素,因此无法存储A数组的最大元素。数组C的大小将int* C = new int[k+1];

第二:当您计算A数组的频率时C那段时间,您正在运行从1n而不是0n-1的循环,这可能会导致错误,因为数组的大小 'Ais '0-based索引的。您在填充循环的数组时犯B类似的错误应该从n-1运行到0

这是正确的,它将完美运行。

#include <iostream>
#include <fstream>
#include <vector> 

using namespace std;
void count(int A[], int B[], int k, int n) {

int i;
int j;
int* C = new int[k+1];

for (i = 0; i < k+1; i++) {
C[i] = 0;
}
for (j = 0; j <n; j++) {
C[A[j]]++; //  error is removed
}


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

for (j = n-1; j >= 0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]] = C[A[j]] - 1;
}

}

int main()
{
int A[] = { 6,5,8,4,3 };
int n = sizeof(A) / sizeof(*A);
int k = 0;
for (int i = 0; i < n; i++) {
if (A[i] > k)
k = A[i];
}

int* B = new int[n];
int j;

count(A, B, k, n);
for (j = 0; j < n; j++)
printf("%d ", B[j]);
printf("n");
return 0;
}