八大排序算法 之 基数排序(桶排序)

如数组:{458--296--13--7--697--61}

排序思想:

1,先按个位上的数字大小顺序排列,结果为61--13--296--7--697--458

2,在上述顺序的基础上,按十位上的大小顺序排列,结果为:7--13--458--61--296

3,在上述顺序的基础上,按百位上的大小顺序排列,结果为:7--13--61--296--458

对于上述,最大数是三位数的数组,只需进行三趟排序即可得到正确的结果;

排序趟数:3(即最大数的位数)

排序原理:桶排序

每个数字的单独一位上(比如个位)的数字只可能是10个,即0~9,那么就建10个桶,分别装对应的数(如第一趟个位是2的放进2号桶里,第二趟十位是2的放进2号桶里),每趟放完之后,在从0~9号桶中依次取出数字,即可得到每趟的排序结果。建桶小提示:(可以用list套list集合的方式--即一个大房间里放10个桶(一个大list集合里放10个小list集合,每个小集合的下标代表它是几号桶))

代码实现如下:

//建一个方法用来计算10的次幂运算;
	public static int pow(int n){
		int value = 1;
		for (int i = 1; i <= n; i++) {
			value *= 10;
		}
		return value;
	}
	//方法主体;
	public static void radixSort(int[] array){
		//得到最大那个数的位数,确定要循环几次
		int max = array[0];
		for (int i = 1; i < array.length; i++) {
			if (max < array[i]) {
				max = array[i];
			}
		}
		int maxLen = String.valueOf(max).length(); 
		//建立10个桶,
		ArrayList<ArrayList<Integer>> list = new ArrayList();
		for (int i = 0; i < 10; i++) {
			list.add(new ArrayList<Integer>());
		}
		
		for (int i = 0; i < maxLen; i++) {
			//根据循环次数的不同,依次求出个、十、百位;并根据下标往桶里加数;
			for (int j = 0; j < array.length; j++) {
				int a = array[j] / pow(i) % 10;
				list.get(a).add(array[j]);
			}
			//从桶里把数一个个按次序拿出来,依次将原来的数组覆盖,完成一个位数的排序
			int n = 0;
			for (ArrayList<Integer> list2 : list) {
				if(list2.size() > 0){
					for (Integer temp : list2) {
						array[n] = temp.intValue();
						n ++;
					}
				}
				list2.clear();//用完之后就清空,等待下一次使用
			}
		}
	}


你可能感兴趣的:(java,排序算法,基数排序,桶排序)