java基数排序

基数排序稳定性:稳定


基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。

 

基数排序


基本思想


像选择排序、插入排序、快速排序等都是基于两个元素的比较进行排序的。而基数排序无需进行元素比较,基于队列处理就能够达到排序的目的。

基数排序不是基于排序关键字来比较排序项,而是基于排序关键字的结构。对于排序关键字中的每一个数字或字符的每一种可能取值,都会创建一个单独的队列。队列的数目就称为基数。

例如:要排序全部由小写字母组成的字符串,则基数就是26,就会用到26个单独的队列。如果对十进制数进行排序,则基数应该是10。

为什么不是所有的排序都使用基数排序算法呢?

1.基数排序算法要根据给定问题特别设计;

2.如果排序关键字中的数字数目与列表中元素的数目接近,那么算法的时间复杂度接近O(n平方);

3.基数影响空间复杂度。

算法分析
在基数排序中,没有任何元素的比较和交换,元素只是在每一轮中从一个队列移动到另一个队列。对于给定的基数,遍历数据的轮次是一个常数,它与排序关键字的数目无关,于是,基数排序算法的时间复杂度为O(n)。

Java实现
/**

 * 基数排序

 * 时间复杂度:O(nlog2n)

 * @param data

 */

public static voidradixSort(int[] data){

    String temp;

    int numObj;

    int digit,num;

    Queue<Integer>[] digitQueue =(LinkedList<Integer>[])(new LinkedList[10]);

    for(int digitVal = 0; digitVal <= 9;digitVal++){

        digitQueue[digitVal] =(Queue<Integer>)(new LinkedList<Integer>());

    }

    //sort

    for(int pos = 0; pos <= 3; pos++){

        for(int scan = 0; scan <data.length; scan++){

            temp = String.valueOf(data[scan]);

            digit =Character.digit(temp.charAt((3 - pos)), 10);

            digitQueue[digit].add(newInteger(data[scan]));

        }

        num = 0;

        for(int digitVal = 0; digitVal <= 9;digitVal++){

           while(!(digitQueue[digitVal]).isEmpty()){

                numObj =digitQueue[digitVal].remove();

                data[num] = numObj;

                num++;

            }

        }

    }

}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱的叹息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值