排序:基數排序

算法思想:基數排序又稱爲「桶子法」,從低位開始將待排序的數按照這一位的值放到相應的編號爲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

相關文章
相關標籤/搜索