C++桶排序
改变NUMMAX是数值的数量
改变BUCKETMAX是桶的数量
其他的都不用更改便可以测试桶排序在数据存储中的速度
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
#define NUMMAX 100000
#define BUCKETMAX 10
typedef int Type;
void test(Type* arrNum, int arrNumMax)
{
for (int i = 0; i < arrNumMax; i++)
{
int num = rand() % NUMMAX;
arrNum[i] = num;
}
}
void showArr(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];
}
}
Type findmax(Type* arrNum, Type arrNumMax)
{
int max = arrNum[0];
for (int i = 0; i < arrNumMax; i++)
{
if (arrNum[i] > max)
max = arrNum[i];
}
return max;
}
int clacDigits(int num)
{
int cnt = 0;
while (num / 10 != 0)
{
num = num / 10;
cnt++;
}
cnt += 1;
return cnt;
}
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;
}
}
}
}
}
void SortBuckettoNum(Type* arrNum, int arrNumMax,
Type** arrBucketAddr, int arrBucketAddrMax, int* BucketFlag)
{
int i, j, k;
for (int 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;
}
}
}
void bucketSort(Type* arrNum, int arrNumMax, int way)
{
Type** arrBucketAddr = new Type* [BUCKETMAX];
int BucketFlag[BUCKETMAX] = { 0 };
newBucket(arrBucketAddr, BUCKETMAX, arrNumMax);
int max = findmax(arrNum, arrNumMax);
int maxDigits = clacDigits(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];
test(arrNum, NUMMAX);
bucketSort(arrNum, NUMMAX, 1);
showArr(arrNum, NUMMAX);
delete arrNum;
return EXIT_SUCCESS;
}