//基数排序 80000-0.017s
//是使用空间换时间的经典算法
void radixSort(int arr[],int length)
{
int index = 0;
int **Arr2D = new int*[10]; //定义一个二维数组作为桶
for (int i = 0; i < 10; i++)
{
Arr2D[i] = new int[length];
}
int ArrElementCount[10] = { 0 }; //定义每个筒有几个数
int max=arr[0];
for (int i = 1; i < length; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
cout << "最大数为" << max << endl;
string s;
ostringstream os;
os << max;
s = os.str();
int maxlength = s.length();
cout << "最大位数为:" << maxlength << endl;
for (int i = 0,n=1; i < maxlength; i++,n*=10)
{
for (int i = 0; i < length; i++)
{
int digitofArr = arr[i] / n % 10;
Arr2D[digitofArr][ArrElementCount[digitofArr]] = arr[i];
ArrElementCount[digitofArr] += 1;
}
index = 0;
for (int i = 0; i < 10; i++)
{
if (ArrElementCount[i] != 0)
{
for (int j = 0; j < ArrElementCount[i]; j++)
{
arr[index] = Arr2D[i][j];
index += 1;
}
}
ArrElementCount[i] = 0;
}
//cout << "第"<<i+1<<"轮桶排序结果为:";
//for (int i = 0; i < length; i++)
//{
// cout << arr[i] << " ";
//}
}
}
int main()
{
srand((unsigned int)time(NULL));
default_random_engine e;
uniform_real_distribution<double>u(0, 1);
int arr[80000];
int length = 80000;
for (int i = 0; i < 80000; i++)
{
arr[i] = u(e) * 800000;
}
start = clock();
//int arr[7] = { 564, 12, 35, 2, 13, 67, 98 };
//int length = 7;
radixSort(arr, length);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK;
cout << duration << endl;
system("pause");
return 0;
}