编辑代码

using System;
using System.Collections.Generic;

public class HelloWorld
{
    public static void Main()
    {
       int[] arr = { 30, 57, 98, 41, 35, 74, 21 };
        Console.Write("排序前\t");
        foreach (int i in arr)
        {   
            Console.Write(i + "\t");    
        }
        Console.WriteLine();

        RadixSort(arr);

        Console.Write("排序后\t");
        foreach (int i in arr)
        { 
            Console.Write(i+"\t");
        }
    }

    static void RadixSort(int[] pArray)
    {
        //最大数长度
        int MaxPlace = GetMaxPlace(pArray);
        //辅助空间
        Queue<int>[] sQueue = new Queue<int>[10];

        //按位数循环
        for (int i = 1; i <= MaxPlace; i++)
        {
            //逐元素入桶
            for (int j = 0; j < pArray.Length; j++)
            {
                //计算关键字
                int key = pArray[j] / (int)Math.Pow(10, i - 1) % 10;
                //桶初始化
                if (sQueue[key] == null)
                {
                    sQueue[key] = new Queue<int>();
                }
                sQueue[key].Enqueue(pArray[j]);
            }
            //逐元素出桶
            int tIdx = 0;
            for (int j = 0; j < sQueue.Length; j++)
            {
                //单队列所有元素出队
                if (sQueue[j] != null)
                {
                    int count = sQueue[j].Count;
                    for (int k = 1; k <= count; k++)
                    {
                        pArray[tIdx++] = sQueue[j].Dequeue();
                    }
                }
            }
        }
    }

    
    static int GetMaxPlace(int[] pArray)
    {
        int maxIdx = 0;
        for (int i = 1; i < pArray.Length; i++)
        {
            if (pArray[i] > pArray[maxIdx])
            {
                maxIdx = i;
            }
        }
        return (int)Math.Floor(Math.Log10(pArray[maxIdx])) + 1;
    }
}