时间复杂度:-
空间复杂度:-
稳定性:稳定
举例:【34,4,251】
第一轮:
0【】,1【251】,2【】,3【】,4【34,4】,5【】,6【】,7【】,8【】,9【】
251,34,4
第二轮:
0【4】,1【】,2【】,3【34】,4【】,5【251】,6【】,7【】,8【】,9【】
4,34,251
第三轮:
0【4,34】,1【】,2【251】,3【】,4【】,5【】,6【】,7【】,8【】,9【】
4,34,251
/// <summary>
/// 基数排序 不可有0 因为临时数组默认是0填充的 如果需要可以先将临时数组用其他不在待排数组中的元素填充
/// </summary>
/// <param name="nums">待排数据</param>
public void Sort(int[] nums)
{
//基本思路 数组中最大数有n位(个十百千万等) 就循环n轮 每轮对应一个位的比较
//需要一个辅助数组 10*nums.Length 行有9列 意味着每位可能出现0~9 列有nums.Length行 意味着数组中的数字在某一位上可能全部相同
int[,] tmp = new int[10, nums.Length];
int maxLen = GetMaxLen(nums);
//遍历
for (int i = 0; i < maxLen; i++)
{
//遍历数组
for (int j = 0; j < nums.Length; j++)
{
//判断当前轮(位) 当前元素该位上的数字
int posNum = nums[j] / (int)Math.Pow(10, i) % 10;
//放入对应的桶的第一个非零位置
for (int k = 0; k < nums.Length; k++)
{
if (tmp[posNum, k] == 0)
{
tmp[posNum, k] = nums[j];
break;
}
}
}
//该轮结束后 将临时数组中数据 放回数组中 并还原临时数组
for (int m = 0, h = 0; m < 10; m++)
{
for (int n = 0; n < nums.Length; n++)
{
if (tmp[m, n] != 0)
{
nums[h] = tmp[m, n];
h++;
tmp[m, n] = 0;
}
}
}
}
}
/// <summary>
/// 获得数组中最大数的位数
/// </summary>
/// <param name="nums">待排数组</param>
/// <returns>最大位数</returns>
int GetMaxLen(int[] nums)
{
int max = nums[0];
for (int i = 1; i < nums.Length; i++)
{
if (max < nums[i])
{
max = nums[i];
}
}
return max.ToString().Length;
}