基数排序

基数排序的本质是比相应位数上的值,如果位数不足则用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;
                }
            }
        }
posted @ 2020-10-28 18:19  这总没有了吧  阅读(52)  评论(0编辑  收藏  举报