基数排序

基数排序

一、介绍

1、概念

基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

2、基本思想

从低位关键码起,按关键码的不同值将序列中的记录“分配”到RADIX个队列(组)中,然后再“收集”,称之为一趟排序,第一趟之后,排序表中的记录已按最低位关键码有序,再次对最低位关键码进行一趟“分配”和“收集”如此直到对最高位关键码进行一趟“分配”和“收集”,则排序表按关键字有序。

比如:对278、109、63、930、589、184、505、269、8、83进行排序
①因为是对10进制整数进行排序,为了方便我们以10为基数进行排序
②为了让位数保持一致,先将位数不够的在高位进行补零操作,变成以下数字:278、109、063、930、589、184、505、269、008、083。
③先按照个位数字进行分组,共有9组(0~9),结果如下
0:930
1:
2:
3:063、083
4:184
5:505
6:
7:
8:278、008
9:109、589、269
将分组后的数据按顺序进行收集:
930、063、083、184、505、278、008、109、589、269
④对上面收集后的数据按照十位进行分组,结果如下:
0:505、008、109
1:
2:
3:930
4:
5:
6:063、269
7:278
8:083、184、589
9:
将分组后的数据按顺序进行收集:
505、008、109、930、063、269、278、083、184、589
⑤对上面收集后的数据按照百位进行分组,结果如下:
0:008、063、083
1:109、184
2:269、278
3:
4:
5:505、589
6:
7:
8:
9:930
将分组后的数据按顺序进行收集:
008、063、083、109、184、269、278、505、589、930
到此我们已经得到了有序的数据序列

二、算法实现

/**
 * 基数排序
 * @param elements  待排序数组
 * @param radix     基数
 * @param bitNum    数据的位数
 */
public static void RadixSort(MyElement[] elements, int radix, int bitNum){
    int n = 1;
    //初始化头指针数组
    MyElementIndex[] heads = new MyElementIndex[radix];
    for (int i = 0; i < heads.length; i++) {
        heads[i] = new MyElementIndex();
    }
    for(int i=0; i<bitNum; i++){
        //将数据按照关键字进行分组
        for(int j=0; j<elements.length; j++){
            int k = elements[j].num/n%10;
            if (heads[k].head == null) {
                heads[k].head = elements[j];
            }else{
                heads[k].tail.next = elements[j];
            }
            heads[k].tail = elements[j];
            heads[k].tail.next = null;
        }
        //将分组后的数据重新收集
        int k = 0;
        for(int j=0; j<heads.length; j++){
            while (heads[j].head != null) {
                elements[k++] = heads[j].head;
                heads[j].head = heads[j].head.next;
            }
        }
        System.out.println("第"+(i+1)+"趟:");
        for (int j = 0; j < elements.length; j++) {
            System.out.print(elements[j].num+" ");
        }
        System.out.println();
        n *= 10;
    }
}

三、运行结果

这里写图片描述

四、性能分析

稳定性:稳定
时间复杂度:分配一趟时间复杂度为O(n),收集一趟时间复杂度为O(RADIX),关键码为bitNum位,共需要bitNum趟,所以时间复杂度为O(bitNum*(n+RADIX))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值