基数排序(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)示例
二、算法实现(核心代码)
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-9int[]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是进制(关键字的取值范围);是稳定的排序算法。