来源百度百科
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
一、基本思想
从低位开始将要排序的数组按照这一位的值放入对应编号0-9的桶中。等待低位排完得到一个序列,将这个序列放回原数组。再根据次低位重新放入相应的桶中,重复操作,至此排到最高位,此时从桶中取出的数据,即为排序后的数据。
二、过程
- 先找出数组中的最大值,以便确定最大的位数
- 从低位进行取值,将所有的数字根据对应位数的值放入对应的桶中
- 从桶中依次取出数据放入数组中
- 重复(2,3)步骤,直至取到最高位即可
假设数组arr = {652,126,352,129,395,854,231,238,536},根据上面步骤操作如下
三、总结
代码:
/**
* 基数排序
* @Author: Han-YLun
* @date 2019/4/27
* @Version 1.0
*/
public class RadixSort {
/**
* 对数组进行基数排序
* @param arr 需要排序的数组
*/
public static void radixSort(int[] arr){
//获取数组中的最大值
int max = findMax(arr,0,arr.length-1);
int[][] buckets;
//根据最大值的位数决定遍历的次数
for (int i = 1; max / i > 0; i *= 10) {
buckets = new int[arr.length][10];
//获取每位数字分配到桶中
for (int j = 0; j <arr.length ; j++) {
int num = (arr[j] / i) % 10;
buckets[j][num] = arr[j];
}
int k = 0;
for (int j = 0; j < 10; j++) {
//对桶中的元素进行回收
for (int l = 0; l < arr.length; l++) {
if (buckets[l][j] != 0){
arr[k++] = buckets[l][j];
}
}
}
}
}
/**
* 递归,求出数组的最大值
* @param arr 数组
* @param l 数组的第一个数
* @param r 数组的最后一个数
* @return 数组中的最大值
*/
private static int findMax(int[] arr, int l, int r) {
//如果数组中只有一个数,直接返回
if (l == r){
return arr[l];
}else{
int a = arr[l];
//递归找出整体的最大值
int b = findMax(arr,l+1,r);
if (a > b){
return a;
}else{
return b;
}
}
}
public static void main(String[] args) {
int[] arr = {100,526,231,5,516,328,418};
radixSort(arr);
for (int i = 0; i < arr.length ; i++) {
System.out.print(arr[i] + " ");
}
}
}
四、结论
- 基数排序是稳定的排序算法
- 基数排序时间复杂度近似于O(N)
- 基数排序的数据需要可以切割出独立的位来比较
- 每一位的数据不能太大,可以用线性排序算法来排序
文章为阿伦原创,如果文章有错的地方欢迎指正,大家互相交流。