0x00007FF6B14E7771 处(位于 基数排序.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000016D476908F0 时发生访问冲突。
问题遇到的现象和发生背景
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
#define NUMMAX 10000
#define BUCKETMAX 10
typedef int Type;
void text(Type arrNum[],int arrNumMax)
{
for (int i = 0; i < arrNumMax;i++)
{
int num = rand() % 1000;
arrNum[i] = num;
}
}
void showArray(Type arrNum[], int arrNumMax)
{
for (int i = 0; i < arrNumMax; i++)
{
cout << arrNum[i] << "\t";
}
}
void newBucket(Type* arrBucketAddr[], int arrBucketAddrMax, int arrNumMax)
{
int i = 0;
for (i = 0; i < arrBucketAddrMax; i++)
{
arrBucketAddr[i] = new Type[arrNumMax];
}
}
void sortNumToBucket(Type arrNum[], int arrNumMax, Type* arrBucketAddr[], int arrBucketAddrMax, int Bucketflag[], int nowDigits, int way)
{
int i = 0,j=0;
if (way == 1)
{
for (i = 0; i < arrNumMax; i++)
{
for (j = 0; j < arrBucketAddrMax; j++)
{
if (arrNum[i] / (int)pow(arrBucketAddrMax,nowDigits) % arrBucketAddrMax == j)
{
*(arrBucketAddr[j]+Bucketflag[j]) = arrNum[i];
Bucketflag[j]++;
break;
}
}
}
}
else if (way == 2)
{
for (i = 0; i < arrNumMax; i++)
{
for (j = 0; j < arrBucketAddrMax; j++)
{
if (arrNum[i] / (int)pow(arrBucketAddrMax, nowDigits) % arrBucketAddrMax == j)
{
*(arrBucketAddr[arrBucketAddrMax-1-j] + Bucketflag[arrBucketAddrMax - 1 - j]) = arrNum[i];
Bucketflag[arrBucketAddrMax - 1 - j]++;
break;
}
}
}
}
}
void sortBucketToNum(Type arrNum[], int arrNumMax, Type* arrBucketAddr[], int arrBucketAddrMax, int Bucketflag[])
{
int i = 0, j = 0, k = 0;
for (i = 0; i < arrNumMax;)
{
for (j = 0; j < arrBucketAddrMax; j++)
{
for (k = 0; k < Bucketflag[j]; k++)
{
arrNum[i] = *(arrBucketAddr[j] + k);
i++;
}
Bucketflag[j] = 0;
}
}
}
Type findMax(Type arrNum[], int arrNumMax)
{
int i = 0;
Type max = arrNum[0];
for (i = 0; i < arrNumMax; i++)
{
if (arrNum[i] > max)
{
max = arrNum[i];
}
}
return max;
}
int calcDigits(Type num)
{
int i=0;
if (num == 0)
{
return 1;
}
for (i = 0; num != 0; num /= 10, i++);
return i;
}
void bucketSort(Type arrNum[], int arrNumMax, int way)
{
Type** arrBucketAddr=new Type* [BUCKETMAX];
int Bucketflag[] = { 0 };
newBucket(arrBucketAddr, BUCKETMAX, arrNumMax);
Type max = findMax(arrNum, arrNumMax);
int maxDigits = calcDigits(max);
for (int nowDigits = 0; nowDigits < maxDigits; nowDigits++)
{
sortNumToBucket(arrNum,arrNumMax,arrBucketAddr,BUCKETMAX,Bucketflag,nowDigits,way);
sortBucketToNum(arrNum, arrNumMax, arrBucketAddr, BUCKETMAX, Bucketflag);
}
delete[] arrBucketAddr;
}
int main()
{
srand((unsigned int)time(NULL));
Type* arrNum = new Type[NUMMAX];
text(arrNum, NUMMAX);
bucketSort(arrNum, NUMMAX, 2);
showArray(arrNum, NUMMAX);
delete[] arrNum;
return EXIT_SUCCESS;
}