基数排序

C#基数排序

今天小智给大家带来的是c#中的基数排序。

基数排序,与选择,冒泡,插入排序不同的是,前者都属于【比较性】排序,而基数排序是【分配式】排序。

就是透过数据的部分资讯,将待排序的元素分配至某些【桶】中,从而达到排序的作用,他属于稳定性的排序。

基数排序的方式有两种:MSD或LSD,MSD是从数据的高位(左边)开始,而LSD是从数据的低位(右边)开始。

下来让小智根据代码给大家详细介绍下吧:(LSD方式)

static void Main(string[] args)
        {
            int []data =new int [10]{1117, 222, 938, 194, 550, 140, 280, 650, 390, 81};
            int[,] temp = new int[10, 10];
            int[] order = new int[10];
            int i, j, k, n=1, lsd;
            Console.WriteLine("原数据:");
            foreach( int number in data)
                Console.Write("{0} ",number);
            Console.WriteLine();
            Console.WriteLine("基数排序——桶排:");
            while (n <= 1000)           //1000:10的3(所给最大数据的位数-1)次方
            {
                k = 0;
                for (i = 0; i < 10; i++)            //将数组data的数按规律(个十百)放进桶temp内
                {
                    lsd = (data[i] / n) % 10;                   //循环时lsd的变化为个,十,百。
                    temp[lsd, order[lsd]] = data[i];
                    order[lsd]++;
                }
                for (i = 0; i < 10; i++)            
                {
                    if (order[i] != 0)
                    {
                        for (j = 0; j < order[i]; j++)      //将temp桶内的数据转入data数组内
                        {
                            data[k] = temp[i, j];
                            //Console.Write("{0} ", data[k]);
                            k++;

                        }
                    }
                    order[i] = 0;
                }
                //Console.WriteLine();
                n *= 10;
            }
            Console.WriteLine("排序后:");
            foreach(int number in data )
                Console.Write("{0} ",number);
            Console.WriteLine();
            Console.ReadKey();

        }

这是C#下的基数排序,待排序的元素为

1117, 222, 938, 194, 550, 140, 280, 650, 390, 81
(1).先根据他们个位数的数值将它们分配至编号0-9的桶子中

for (i = 0; i < 10; i++)            //将数组data的数按规律(个十百)放进桶temp内
                {
                    lsd = (data[i] / n) % 10;                   //循环时lsd的变化为个,十,百。
                    temp[lsd, order[lsd]] = data[i];
                    order[lsd]++;
                }

0       1   2    3    4 5 6 78 9

550 81222 194            1117       938

140

280

650

390

(2).放入桶子后在按顺序将各个元素放回data数组内,此时data数组数据为{550,140,280,650,390,81,222,194,1117,938};

 for (i = 0; i < 10; i++)            
                {
                    if (order[i] != 0)
                    {
                        for (j = 0; j < order[i]; j++)      //将temp桶内的数据转入data数组内
                        {
                            data[k] = temp[i, j];
                            //Console.Write("{0} ", data[k]);
                            k++;

                        }
                    }
                    order[i] = 0;
                }

(3)再循环进行(1)(2)步,直到n<=1000

那么这个跳出循环条件n<=1000怎么判断呢,这个1000其实是10的3(待排序元素中最大元素的位数-1)次方。

下面小智给大家把基数排序的后几步数据展示一下 :

a.第二次循环(以十位为基准放入桶内)

0    1   2   3   4   5   6   7  8   9

1117222 938140 550280 390

65081 194

b.第三次循环(以百位为基准放入桶内)

0 1 2 3 45 6 7 8 9

81 1117222 390550 650938

140280

194

c.第四次循环(以千位为基准放入桶内)

0 1 2 3 45 6 7 8 9

81      1117

140

194

222

280

390

550

650

938

相信大家也看见了到最后一次循环大部分数占据了0列的空间,而右边偌大的空间都没有用,但是他仍然在,所以这就是基数排序的一个弊端,

他不适合对位数多的数据(10000)或者总量多的数据的排序,否则会极大地浪费空间与时间,比如说排序{2,5,3,9,4,10000000},如果要排序这个数组,基数排序就要运行8次那种大循环,分配6*6个int字节的内存空间,而其他的排序则很快就完了,也不会浪费多少内存。

这就是整个基数排序的思想,不知道亲们懂了吗!!再会


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值