基数排序

时间复杂度:-

空间复杂度:-

稳定性:稳定

举例:【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;
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值