基数排序(Radix Sort)

本文详细介绍了基数排序(Radixsort)的原理与实现过程。通过具体的示例,展示如何利用桶排序的思想,对多位数的每一位进行排序,最终得到有序数组。文章还提供了完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

经典排序算法 - 基数排序Radix sort

原理类似桶排序,这里总是需要10个桶,多次使用

首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数

例如

待排序数组[62,14,59,88,16]简单点五个数字

分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样

|  0  |  0  | 62 |  0  | 14 |  0  | 16 |  0  |  88 | 59 |

|  0  |  1  |  2  |  3  |  4 |  5  |  6  |  7  |  8  |  9  |桶编号

将桶里的数字顺序取出来,

输出结果:[62,14,16,88,59]

再次入桶,不过这次以十位数的数字为准,进入相应的桶,变成下边这样:

由于前边做了个位数的排序,所以当十位数相等时,个位数字是由小到大的顺序入桶的,就是说,入完桶还是有序

|  0  | 14,16 |  0  |  0  |  0  | 59 | 62  | 0  | 88  |  0  |

|  0  |  1      |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |桶编号


因为没有大过100的数字,没有百位数,所以到这排序完毕,顺序取出即可

最后输出结果:[14,16,59,62,88]

 

 

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 * 基数排序
 * 限制:数值只能是正整数
 * 算法思想:从低位开始排序,根据排序的结果重新排序
 * @author sunlzx
 * 
 */
public class RadixSort {

	public static void main(String[] args) {
		//随即生成待排序的数据
		int size = 10;
		Integer[] nums = new Integer[size];
		Random random = new Random();
		for (int i = 0; i < nums.length; i++) {
			nums[i] = random.nextInt(1000);
		}

		System.out.println("before:" + Arrays.toString(nums));
		//基数排序
		radixSort(nums);
		System.out.println("after:" + Arrays.toString(nums));

	}

	public static void radixSort(Integer[] nums) {
		int max = getMax(nums);
		System.out.println("max : " + max);
		int times = 1;
		do {
			radixSort(nums, times);
			times++;
		} while (max / (int) Math.pow(10, times - 1) > 0);
	}

	/**
	 * 获取待排序中的最大值
	 * @param nums
	 * @return
	 */
	private static int getMax(Integer[] nums) {
		int max = 0;
		for (Integer i : nums) {
			if (i > max) {
				max = i;
			}
		}
		return max;
	}

	/**
	 * 
	 * @param nums
	 * @param times 1根据个位排序,2根据百位排序,依次类推
	 */
	private static void radixSort(Integer[] nums, int times) {
		List<Integer>[] buckets = new List[10];
		for (int i = 0; i < buckets.length; i++) {
			buckets[i] = new ArrayList<Integer>();
		}
		for (int i = 0; i < nums.length; i++) {
			int n = nums[i];
			int index = n / (int) Math.pow(10, times - 1) % 10;
			buckets[index].add(n);
		}
		System.out.println(Arrays.toString(buckets));
		int index = 0;
		for (List<Integer> list : buckets) {
			for (Integer integer : list) {
				nums[index] = integer;
				index++;
			}
		}

	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值