接下来是代码的实现:
/*
* 基数排序基本思想:
* 基数排序又名桶排序。是一种关键字为整型时非常高效的排序方法。
* 步骤:
* (1):明确数据时什么进制(Scale)的整数。 若是 10进制,则分10个
* 桶,桶的编号是0、1、2、......、9。若是8进制,则分8个桶,桶的编号是
* 0、1、2、......、7。
* (2):然后就是规则:数据从低位到高位(个位到百位(数据是三位数))
* (3):要求进出桶的数据元素序列满足先进先出的原则。所以这里用到队列
*/
#include <iostream>
#include <queue>//用到了 STL中“队列”
#include <iomanip>
using namespace std;
typedef int DataType; //数据类型
#define Size 20 //数组大小
#define digitNum 3 //数据元素中最大数值的位数
#define scale 10 //数值的进制 10进制
void PaintArray(DataType Array[], int lengthOfArray);//输出数组
void RaidxSort(DataType Array[]/*数组*/, int lengthOfArray/*数组长度*/,
int X_digitNum/*位数*/, int Scale/*进制*/);//基数排序
int main(void)
{
DataType Array[Size] = {
23, 45, 67, 43, 65,
123, 543, 341, 787, 742,
4, 3, 54, 32, 45,
56, 62, 233, 456, 34};
PaintArray(Array, Size);
RaidxSort(Array, Size, digitNum, scale);
PaintArray(Array, Size);
return 0;
}
void PaintArray(DataType Array[], int lengthOfArray)
{
for(int i = 0; i < lengthOfArray; i++)
cout<<Array[i]<<" ";
cout<<endl;
}
void RaidxSort(DataType Array[]/*数组*/, int lengthOfArray/*数组长度*/,
int X_digitNum/*位数*/, int Scale/*进制*/)
{
queue<DataType>* bucket = new queue<DataType>[Scale];
int power = 1;//这就是那个公式的应用
for(int i = 0; i < X_digitNum; i++)
{
if(i == 0) power = 1;
else
power = power * Scale;
//将数据分配到桶里
for(int j = 0; j < lengthOfArray; j++)
{
int k = Array[j]/power - Array[j]/(power*Scale) * Scale;
bucket[k].push(Array[j]);
}
//将数据顺序(FIFO)从桶中取出
int count = 0;
for(int i = 0; i < Scale; i++)
while(!bucket[i].empty())
Array[count] = bucket[i].front(),bucket[i].pop(),count++;
}
}