笨办法学数据结构 基数排序的介绍与实现

基数排序(桶排序)介绍:

1) 数排序 radix sort )属于“分配式排序”( distribution sort ),又称“桶子法”( bucket sort )或 bin sort ,顾名思义,它 通过 键值的各个位的值, 将要排序的 元素分配 至某些“桶”中 ,达 到排序的作
2) 数排序法是属于稳定性的排 序, 基数排序法 的是效率高的 稳定性排序
3) 基数排序 (Radix Sort) 桶排序 的扩展
4) 基数排 序是 1887 年赫尔曼 · 何乐 礼发明的。 它是这样实现的 将整数按位数切割成不同的数字,然后按每个位数分别比

基数排序本思想

所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序 

基数排序的说明:

1) 基数排序是对传统桶排序的扩展,速度很快 .
2) 排序是经典的空间换时间的方式,占用内存很大 , 当对海量数据排序时,容易造成 OutOfMemoryError
3) 数排序时稳定的 [ : 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中, r[ i ]=r[j] ,且 r[ i ] r[j] 之前,而在排序后的序列中, r[ i ] 仍在 r[j] 之前, 则称这种排序算法是稳定的;否则称为不稳定的 ]
 
代码演示:


import java.util.Arrays;

public class RadixSort {
	public static void main(String[] args) {
		int arry[] = { 53, 3, 542, 748, 14, 214};
		radixSort(arry);
//		System.out.println(Arrays.toString(arry));
	}
	public static void radixSort(int arry[]) {
		int max=arry[0],temp=0,count=0;
		//定义一个二维数组,表示10个桶, 每个桶就是一个一维数组
		//说明
		//1. 二维数组包含10个一维数组
		//2. 为了防止在放入数的时候,数据溢出,则每个一维数组(桶),大小定为arr.length
		//3. 名明确,基数排序是使用空间换时间的经典算法
		int bucket[][]=new int[10][arry.length];
		//为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数
		//可以这里理解
		//比如:bucketElementCounts[0] , 记录的就是  bucket[0] 桶的放入数据个数
		int indexbucket[]=new int[10];
		//1. 得到数组中最大的数的位数
		//假设第一数就是最大数
		for (int i = 0; i < arry.length; i++) {
			if(arry[i]>max) {
				max=arry[i];
			}
		}
		int lenth=(max+"").length();
		for(int i=0,n=1;i<lenth;i++,n*=10) {
			//(针对每个元素的对应位进行排序处理), 第一次是个位,第二次是十位,第三次是百位..
			for (int j = 0; j < arry.length; j++) {
				//取出每个元素的对应位的值
				temp=arry[j]/n%10;
				//放入到对应的桶中
				bucket[temp][indexbucket[temp]]=arry[j];
				indexbucket[temp]++;
			}
			//按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
			count=0;
			//遍历每一桶,并将桶中是数据,放入到原数组
			for (int j = 0; j < indexbucket.length; j++) {
//				System.out.println(count);
				//如果桶中,有数据,我们才放入到原数组
				if(indexbucket[j]!=0) {
				//循环该桶即第k个桶(即第k个一维数组), 放入
					for (int k = 0; k < indexbucket[j]; k++) {
						//取出元素放入到arry		
						arry[count++]=bucket[j][k];
					}
				}
				//第i+1轮处理后,需要将每个 indexbucket[j]=0; !!!!
				indexbucket[j]=0;
			}
			System.out.println("第"+(i+1)+"次排序结果:"+Arrays.toString(arry));
		}
	}
}

运行结果:

 

 

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页