排序整理——基数排序

       基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

步骤:

 1、建立10个数组:0,1,2,3,4,5,6,7,8,9

 2、第一次按个位排放入数组,再以数组号从小到大取出来

 3、第二次按十位排放入数组,再以数组号从小到大取出来

 4、··········

注意:排序的次数取决于最大的数有几位。

java实现源码:

package myself;

import java.util.Arrays;

public class RodixSort {

	public static void main(String[] args) {
		int a[]= {789,15,2,1,59,2668,595,32985,326,596,59,9,369,56,89,159,753,489};
		rodixSort(a);
		System.out.println(Arrays.toString(a));
	}
	public static void rodixSort(int a[]) {
		//找出数组中最大的数字
		int max=Integer.MAX_VALUE;
		for(int i=0;i<a.length;i++) {
			if(a[i]>max) {
				max=a[i];
			}
		}
		//计算最大数字是几位数
		int maxLength=(max+"").length();
		//用于临时存储数据的数组
		int temp[][]=new int[10][a.length];
		//用于记录在temp中相应的数组中存放的数字数量
		int counts[]=new int[10];
		//根据最大长度的数决定比较的次数
		for(int i=0,n=1;i<maxLength;i++,n*=10) {
			//把每一个数分别计算余数
			for(int j=0;j<a.length;j++) {
				//计算余数
				int ys=a[j]/n%10;
				//把当前遍历的数据放入指定的数据中
				temp[ys][counts[ys]]=a[j];
				//记录数量
				counts[ys]++;
			}
			//记录取得元素需要放的位置
			int index=0;
			//把数字取出来
			for(int k=0;k<counts.length;k++) {
				//记录数量的数组中当前余数记录的数量不为0
				if(counts[k]!=0) {
					//循环取出数组
					for(int l=0;l<counts[k];l++) {
						//取出元素
						a[index]=temp[k][l];
						//记录下一个位置
						index++;
					}
					//把数量置为0
					counts[k]=0;
				}
			}
		}
	}

}

 其实不难发现,基数排序在从对应数组中取数的时候是先进先出,和队列进出的形式是一样的,所以也可以通过队列形式做基数排序。

猜你喜欢

转载自blog.csdn.net/Marmara01/article/details/84894367