基数排序

基数排序

个人理解

基数排序抓住了排序的特点在于,排序就是0-9的阿拉伯数组比较,而且0-9越来越大,而且规则在于位数多的肯多大于位数少的。

那我先准备好0-9个篮子,然后把这个数一位一位的往里面放,然后我从0-9的遍历,循环起来,是不是就可以排序了呢?

举个例子

比如我的序列是 0,2,4,3,1,5,那我准备个0-9的篮子

然后从左到右,0放到0号篮子,2到2号……

最后我从0-9遍历,那结果不就是,0,1,2,3,4,5了么

有人问,那位数多了呢?

那我一位一位比较咯,比完了重新一遍排序不就可以了么?

接着先对个位数排序,然后十位数排序,依次对位数更高的排序

这样巧妙的一个点在于每次排序之后的低位都是有序的,然后当位数取余为0的时候(没有对应的高位),那么直接取出它就是对应的顺序了。

至于怎么想到的这么巧妙的算法,我也奇怪。
我们只能说用假说演绎法来证明这个算法的正确了

以下转载自基数排序
在这里插入图片描述

上面这幅图,或许你已经在其他的博客里见到过。这是一个很好的引导跟说明。在基数排序里,我们需要一个很大的二维数组,二维数组的大小是 (10 * n)。10 代表的是我们每个元素的每一位都有 10 种可能,也就是 10 进制数。在上图中,我们是以每个数的个位来代表这个数,于是,5428 就被填充到了第 8 个桶中了。下次再进行填充的时候,就是以十位进行填充,比如 5428 在此时,就会选择以 2 来代表它。

代码实现之

package sort;

import java.util.Arrays;

public class RadixSort
{
	public static void main(String[] args)
	{

		int[] arr =
		{ 7, 8, 2, 36, 8, 4, 2, 456, 21, 5647 };

		radixSort(arr);
	}

	public static void radixSort(int[] arr)
	{

		int max = arr[0];
		for (int i = 0; i < arr.length; i++)
		{
			if (max < arr[i])
			{
				max = arr[i];
			}
		}
		int maxLength = (max + "").length();
		// 定义十个桶
		int[][] bucket = new int[10][arr.length];
		int[] bucketElementCounts = new int[10];

		// -----------------第一次--------------------

		for (int k = 0, div = 1; k < maxLength; k++, div *= 10)
		{
			// 先分桶
			for (int i = 0; i < arr.length; i++)
			{
				int digitOfElement = arr[i] / div % 10;
				bucket[digitOfElement][bucketElementCounts[digitOfElement]++] = arr[i];
			}
			// 拿出来覆盖之前的序列,之前的序列成为低位有序的序列

			int index = 0;
			// 遍历 1-10
			for (int i = 0; i < bucketElementCounts.length; i++)
			{
				// 遍历每个桶
				for (int j = 0; j < bucketElementCounts[i]; j++)
				{
					arr[index++] = bucket[i][j];
				}
				bucketElementCounts[i]=0;
			}
			
			System.out.println("第"+(k+1)+"次:");
			System.out.println(Arrays.toString(arr));

		}

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值