基数排序
基数排序的本质是比相应位数上的值,如果位数不足则用0补齐的一个排序算法,该算法时间复杂度很低,但空间复杂度很高,是典型的空间换时间算法
完整代码如下:
public static void radixSort(int[] arr)
{
int max = arr[0];//假设第一个为最大值
//foreach循环取得最大值
foreach (int item in arr)
{
if (item > max)
{
max = item;
}
}
int maxLength = (max + "").Length;//获得最大值的长度
//定义一个二维数组,该二维数组表示有十个桶,每个桶可以装arr.Length个数(这么做是怕溢出)
int[,] bucket = new int[10, arr.Length];
//定义一个一维数组,该数组记录相应下标的桶装的元素的个数 例如eleofcount[0]=1 表示下标为0的桶装了一个元素
int[] eleofcount = new int[10];
//最外层循环,该循环次数为最大值的长度
for (int j = 0, n = 1; j < maxLength; j++, n *= 10)
{
//取出数组中本次外循环该取出的位数上的值(如第0轮应该取个位),并放入相应的桶中
for (int i = 0,n=10; i < arr.Length; i++,n*=10)
{
int ele = arr[i] / n % 10;
//难理解 bucket[0,0]则表示下标为0的桶里第0个元素为arr[i]
bucket[ele, eleofcount[ele]++] = arr[i];
}
int index = 0;//定义一个索引来把桶中元素放回原数组
//该循环遍历所有桶
for (int i = 0; i < eleofcount.Length; i++)
{
//如果下标为i的桶的eleofcount的值不为0 说明里面有元素
if (eleofcount[i] != 0)
{
//循环取出下标为i个桶的元素
for (int k = 0; k < eleofcount[i]; k++)
{
arr[index++] = bucket[i, k];
}
}
//把下标为i的桶清零
eleofcount[i] = 0;
}
}
}