排序:基数排序

算法思想:基数排序又称为“桶子法”,从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完获得一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。java

算法过程:算法

1.求出数组中最大元素值的位数  例:1(一位) 10(二位) 100(三位)数组

2.依据过程一算得的位数,依次按个位数,十位数,百位数,千位数,从低位到高位对数组元素进行排序。假若数组中最大值是789(3位),依次按个位数,十位数,百位数,对数组元素进行(3次)排序。app

过程2 中用到了一个二位数组来暂存数组元素,bucket数组最后一位用于记录放进去的元素数量。测试

int[][] bucket = new int[10][elements.length+1];

按个位数排序时,若是有一个元素,个位数是3,那么这个元素就会被存到bucket[3][?]中,并对bucket数组最后一个元素+1.net

按十位数,百位数,千位数排序时亦然。code

public static void baseNumSort(int[] elements) {
	String[] temp = {"个","十","百","千"};
	int max = getMax(elements);
	for(int i=1;i<=max;i++) {
		System.out.println("按"+temp[i-1]+"位数排序");
		sort(elements,i);
		System.out.println("排序后获得的数组:"+Arrays.toString(elements));
	}
}

/**
 * 将数组elements中的元素按指定位数值的大小排序
 * @param elements
 * @param ext	1--个位  2--十位 3--百位  依次类推
 */
private static void sort(int[] elements, int ext) {
	int[][] bucket = new int[10][elements.length+1];
	int extNum = 0;
	int count = 0;
	for(int i=0;i<elements.length;i++) {
		extNum = getPointNum(elements[i], ext);
		count = bucket[extNum][elements.length];
		bucket[extNum][count] = elements[i];
		bucket[extNum][elements.length] = count + 1;
	}
	System.out.println("----------------------------------bucket----------------------------------");
	for(int i=0;i<10;i++) {
		System.out.print(i+"-->\t");
		for(int j=0;j<elements.length+1;j++) {
			System.out.print(bucket[i][j]+"\t");
		}
		System.out.println();
	}
	System.out.println("----------------------------------bucket----------------------------------");
	int k = 0;
	for(int i=0;i<10;i++) {
		count = bucket[i][elements.length];
		if(count > 0) {
			for(int j=0;j<count;j++) {
				elements[k++] = bucket[i][j];
			}
		}
	}
}

/**
 * 获取参数number指定位数上的值
 * @param number  整数
 * @param point	  1--个位  2--十位 3--百位  依次类推
 * @return  参数number指定位数上的值
 */
private static int getPointNum(int number, int point) {
	int base = 1;
	for(int k = 1; k < point; k++) {
		base = 10 * base;
	}
	return number/base%10;
}

/**
 * 获取数组中最大元素值的位数
 * @param elements
 * @return
 */
private static int getMax(int[] elements) {
	int maxElement = elements[0];
	for(int i=1;i<elements.length;i++) {
		if(elements[i] > maxElement) {
			maxElement = elements[i];
		}
	}
	int base = 10;
	int ext = 1;
	while(maxElement >= base) {
		++ext;
		base = 10 * base;
	}
	System.out.println("数组中最大值的位数:"+ext);
	return ext;
}

测试:blog

public static void main(String[] args) {
	int[] array = {82 ,31 ,29 ,71, 72, 42, 64, 5, 110};
	baseNumSort(array);
}

结果:排序

数组中最大值的位数:3
按个位数排序
----------------------------------bucket----------------------------------
0-->	110	0	0	0	0	0	0	0	0	1	
1-->	31	71	0	0	0	0	0	0	0	2	
2-->	82	72	42	0	0	0	0	0	0	3	
3-->	0	0	0	0	0	0	0	0	0	0	
4-->	64	0	0	0	0	0	0	0	0	1	
5-->	5	0	0	0	0	0	0	0	0	1	
6-->	0	0	0	0	0	0	0	0	0	0	
7-->	0	0	0	0	0	0	0	0	0	0	
8-->	0	0	0	0	0	0	0	0	0	0	
9-->	29	0	0	0	0	0	0	0	0	1	
----------------------------------bucket----------------------------------
排序后获得的数组:[110, 31, 71, 82, 72, 42, 64, 5, 29]
按十位数排序
----------------------------------bucket----------------------------------
0-->	5	0	0	0	0	0	0	0	0	1	
1-->	110	0	0	0	0	0	0	0	0	1	
2-->	29	0	0	0	0	0	0	0	0	1	
3-->	31	0	0	0	0	0	0	0	0	1	
4-->	42	0	0	0	0	0	0	0	0	1	
5-->	0	0	0	0	0	0	0	0	0	0	
6-->	64	0	0	0	0	0	0	0	0	1	
7-->	71	72	0	0	0	0	0	0	0	2	
8-->	82	0	0	0	0	0	0	0	0	1	
9-->	0	0	0	0	0	0	0	0	0	0	
----------------------------------bucket----------------------------------
排序后获得的数组:[5, 110, 29, 31, 42, 64, 71, 72, 82]
按百位数排序
----------------------------------bucket----------------------------------
0-->	5	29	31	42	64	71	72	82	0	8	
1-->	110	0	0	0	0	0	0	0	0	1	
2-->	0	0	0	0	0	0	0	0	0	0	
3-->	0	0	0	0	0	0	0	0	0	0	
4-->	0	0	0	0	0	0	0	0	0	0	
5-->	0	0	0	0	0	0	0	0	0	0	
6-->	0	0	0	0	0	0	0	0	0	0	
7-->	0	0	0	0	0	0	0	0	0	0	
8-->	0	0	0	0	0	0	0	0	0	0	
9-->	0	0	0	0	0	0	0	0	0	0	
----------------------------------bucket----------------------------------
排序后获得的数组:[5, 29, 31, 42, 64, 71, 72, 82, 110]

 

参考:element

http://www.javashuo.com/article/p-erpmqxwx-bs.html

相关文章
相关标签/搜索