基数排序

基数排序

思想

  • 通过按照键值的各个位的值,把要排序的元素分配到某些桶中,最终实现排序的效果。
  • 将所有待比较的数值统一为同样的数位长度,数位较短的数的前面补充零。
  • 从低位开始依次进行排序,这样从最低位排序到最高位排序完成之后,整个序列就变成了一个有序的序列。

示意图

特点

  • 稳定性排序
  • 基数排序是桶排序的扩展
  • 基数排序的时间复杂度为O (nlog(r)m)

代码

package sort;

import java.util.Arrays;

public class RadixSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a= {53,3,542,748,14,214};
		System.out.println(Arrays.toString(a));
		radixSort(a);
		System.out.println(Arrays.toString(a));
		
	}
	//基数排序
	
	public static void radixSort(int[] a){
		//得到数组中最大数的位数
		int max=a[0];
		for(int i=1;i<a.length;i++)
		{
			if(a[i]>max)
			{
				max=a[i];
			}
		}
		//得到最大的位数
		int maxLength=(max+"").length();
		int[][] bucket=new int[10][a.length];//创建桶
		int [] bucketElementCounts=new int[10];//记录每一个桶中元素的个数
		int n=1;
		for(int i=0;i<maxLength;i++,n*=10)//多少位进行多少轮
		{
			for(int j=0;j<a.length;j++)
			{
				int digitOfElement=a[j]/n%10;//求对应个位、百位、千位
				bucket[digitOfElement][bucketElementCounts[digitOfElement]]=a[j];//放入桶中
				bucketElementCounts[digitOfElement]++;//对应桶中元素增加
			}
			//按照这个桶的顺序
			int index=0;
			//遍历每一个桶,并把桶中的数据放到原来的数组
			for(int k=0;k<bucketElementCounts.length;k++)
			{
				if(bucketElementCounts[k]!=0)//桶中有数据
				{
					for(int l=0;l<bucketElementCounts[k];l++)//把桶中数据放回原来的数组
					{
						a[index++]=bucket[k][l];
					}
				}
				//放完了桶中的数据之后,桶中的数据就为空
				bucketElementCounts[k]=0;
			}
			
		}
		
	}

}

posted @ 2019-10-22 21:29  梦小冷  阅读(171)  评论(0编辑  收藏  举报