龙空技术网

排序算法之基数排序

愁的慌 95

前言:

目前小伙伴们对“基数排序算法实现”大概比较着重,我们都想要了解一些“基数排序算法实现”的相关资讯。那么小编同时在网摘上搜集了一些关于“基数排序算法实现””的相关内容,希望看官们能喜欢,姐妹们快快来了解一下吧!

基数排序介绍

基数排序,是一种非比较型整数排序算法,先把所有元素补位,让所有元素的位数相同,然后把序列中的每个元素按照位数进行分桶的一种算法,

基数排序的实现方法分为两种:MSD和LSD。

MSD:最高位优先法(Most Significant Digit First),先比较最高位,最高位分到一个桶中的,再按照第二位进行分桶…,知道分到最后一位,然后再从最小的桶中逐层向上,把元素都拿出来,即完成排序。

LSD:最低位优先法(Least Significant Digit First),先比较最低位,也就是个位,进行分桶,分桶过程中分到一个桶中的数据直接追加到桶中即可,无需排序。然后将所有同种的元素按桶的顺序拿出,重新组成序列,然后比较十位,进行分桶…直到比较到最高位,重新组成序列即可完成排序。

基数排序步骤

以LSD为例

设定10个桶,分别存放位数为0-9的元素。遍历初始序列,将元素放入不同的桶中按照桶的顺序,把桶中元素全部拿出来重新组装成一个序列。重复2、3步骤,直到最高位。即可完成排序代码实现

public class RadixSort {	public static void radixSort(int[] arr) {		if (arr == null || arr.length == 0) {			return;		}		// 采用LSD方法		radixSortLSD(arr, 1);	}	/**	 * LSD方式 排序	 * @param arr 序列	 * @param digit 位数 个位1十位2百位3......	 */	private static void radixSortLSD(int[] arr, int digit) {		int len = arr.length;		// 定义十个桶(分别存放个位数为0、1、2......9的数字)		int[][] buckets = new int[10][];		boolean isAppend = false;		for (int i = 0; i < len; i++) {			String valStr = String.valueOf(arr[i]);			if (valStr.length() >= digit) {				int index =  Integer.parseInt(valStr.substring(valStr.length() - digit, valStr.length() - digit + 1));				buckets[index] = appendItem(buckets[index], arr[i]);				isAppend = true;			}		}		// 从桶中拿出所有元素		if (isAppend) {			int k = 0;			for (int[] b : buckets) {				if (b != null) {					for (int i = 0; i < b.length; i++) {						arr[k++] = b[i];					}				}			}			digit++;			radixSortLSD(arr, digit);		}	}	private static int[] appendItem(int[] bucketArr, int val) {		if (bucketArr == null || bucketArr.length == 0) {			return new int[]{val};		}		// 拷贝一下原来桶的序列,并增加一位		int[] arr = Arrays.copyOf(bucketArr, bucketArr.length + 1);		arr[bucketArr.length] = val;		return arr;	}}

标签: #基数排序算法实现