经典排序算法(10)——基数排序算法详解

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


一、算法基本思想

(1)基本思想

基数排序是基于桶排序来实现。通过键值的部分信息,将要排序的元素分配至某些“桶”中,以此达到排序的作用。

基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。

(2)运行过程

基数排序算法(LSD)的运行过程如下:

1、根据待排序整数序列的进制d(十进制为10,十六进制为16...)设置d个桶,编号分别为0,1,...,d-1;
2、各个记录按照其关键字最低位的值的大小放入到相应的桶中;
3、按照桶编号从小到大的顺序收集各个桶中的数据,对于同一桶中的数据按照先后次序收集,先进桶先收集;
4、按照关键字的次低位,重复上述步骤...(没有高位的数据则高位补0 )按增量序列个数k,对序列进行k 趟排序; 
3)每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

(3)示例

经典排序算法(10)——基数排序算法详解_第1张图片


二、算法实现(核心代码)

Java实现:

public class RadixSort
{
    public static void sort(int[] number, int d) //d表示最大的数有多少位
    {
        intk = 0;
        intn = 1;
        intm = 1; //控制键值排序依据在哪一位
        int[][]temp = newint[10][number.length]; //数组的第一维表示可能的余数0-9
        int[]order = newint[10]; //数组orderp[i]用来表示该位是i的数的个数
        while(m <= d)
        {
            for(inti = 0; i < number.length; i++)
            {
                intlsd = ((number[i] / n) % 10);
                temp[lsd][order[lsd]] = number[i];
                order[lsd]++;
            }
            for(inti = 0; i < 10; i++)
            {
                if(order[i] != 0)
                    for(intj = 0; j < order[i]; j++)
                    {
                        number[k] = temp[i][j];
                        k++;
                    }
                order[i] = 0;
            }
            n *= 10;
            k = 0;
            m++;
        }
    }
    public static void main(String[] args)
    {
        int[]data =
        {73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100};
        RadixSort.sort(data, 3);
        for(inti = 0; i < data.length; i++)
        {
            System.out.print(data[i] + "");
        }
    }
}

三、性能(算法时间、空间复杂度、稳定性)分析

基数排序的时间复杂度是O(2*k*n),其中n是排序元素个数,k是数字位数;空间复杂度采用数组是O(n*d),采用链表是O(d+n)d是进制(关键字的取值范围);是稳定的排序算法


你可能感兴趣的:(数据结构和算法,基数排序,排序算法)