基数排序是排序算法中最后一个排序算法,算法思想:
算法思想:
1 找出最长的数字,确定要处理的最长的数字的位数,也是趟数;
2 一次由个位开始处理,把相应位数上的数字,放入相应序号的桶里面,完成后,再按照桶的序号,一次取出桶里面的数据,放回原始的数组当中;
3 当处理完成所有的位数,最终得到有序的序列。
// 时间复杂度 O(d*n) 空间复杂度O(n)
void RadixSort(int arr[], int size)
{
int maxData = arr[0];
// 第一步:找出数组中最大的数组
for (int i = 0; i < size; i++)
{
if (maxData < abs(arr[i]))
{
maxData = abs(arr[i]);
}
}
// 将Maxdata转为string,利用string的size方法
int len = to_string(maxData).size();
vector<vector<int>> vecs; //二维数组,用于存放桶号和桶
int mod = 10;
int dev = 1;
for (int i = 0; i < len; i++, mod *= 10, dev *= 10) // 趟数 O(d)
{
vecs.resize(10); // vector默认大小是0,不能直接使用vecs[2]等,要先初始化
for (int j = 0; j < size; j++) // O(n)
{
// 从各位开始,依次得到每位元素,并放入相应的桶中。
int index = arr[j] % mod / dev;
vecs[index].push_back(arr[j]);
}
// 依次遍历所有桶,把元素拷贝到原始数组当中
int idx = 0;
for (auto vec : vecs) // O(n)
{
for (int v : vec)
{
arr[idx++] = v;
}
}
vecs.clear(); // 该方法清空vector数组,容量大小变为0;
}
}
时间复杂度:O(dn),d是趟数,n是元素个数;
空间复杂度:O(n)