Skip to content

基数排序

基数排序算法回顾

题目

示例1

输入: nums = [1, 4, 3, 100, 323, 53, 13, 559230, 123, 20, 43, 12]
输出: [1,3,4,12,13,20,43,53,100,123,323,559230]

解题思路

​ 基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;

​ 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。基数排序基于分别排序,分别收集,所以是稳定的。

​ 时间复杂度:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。

​ 基数排序是稳定的排序算法

java
import java.util.*;

public class RadixSort {
    public static void main(String[] args) {
        int[] array = {1, 4, 3, 100, 323, 53, 13, 559230, 123, 20, 43, 12};
        sort(array);
        for (Integer i : array) {
            System.out.print(i+" ");
        }
    }

    // 基数排序,注意这里只能排序正整数
    public static void sort(int[] array) {
        // 找到数组中最大数max,并计算它的位数maxDig
        int max = array[0];
        for (int maxTemp : array) {
            max = Math.max(max, maxTemp);
        }
        int maxDig = String.valueOf(max).length();
        // 创建从0-9的基数数据集
        Map<Integer, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            map.put(i, new ArrayList<Integer>());
        }
        // 从低位baseDig开始到高位maxDig进行指定位的基数排序
        int baseDig = 1;
        while (baseDig <= maxDig) {
            // 第一阶段,遍历目标数组,将数组元素放入指定的基数数据集中
            for (int temp : array) {
                String strVal = String.valueOf(temp);
                // 获取元素baseDig位的数字,放入相对的基数数据集中
                // 如果不存在,将该元素放入0基数数据集中
                Integer key = null;
                if (strVal.length() < baseDig) {
                    key = 0;
                } else {
                    // 获取指定位上的字符,并转化成目标基数key
                    char bitNum = strVal.charAt(strVal.length() - baseDig);
                    key = Integer.valueOf(String.valueOf(bitNum));
                }
                map.get(key).add(temp);
            }
            int j = 0;
            // 第二阶段,将0-9基数数据集中的数据,放回到数组中
            // 表示当前baseDig位的基数排序完成
            for (int i = 0; i < 10; i++) {
                Iterator<Integer> it = map.get(i).iterator();
                while (it.hasNext()) {
                    array[j++] = it.next();
                }
                map.get(i).clear();
            }
            baseDig++;
        }
    }
}