1.基本思想
基数排序不同于前面的几种排序方式,前面介绍的排序方法或多或少的是通过使用比较和移动来实现排序,而基数排序的实现不需要进行对关键字进行比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。
采用“桶子法”来实现。准备10个桶子,有两种方法,这两种思想都是一样的。
(1)最低位优先法:根据待排序数的个位的数来确定装入哪个桶,装入之后,然后取出,然后再根据十位上的数再装入桶,再取出,直到取到这组数中的最大数的最高位结束。(如图下所示)
上图中就是按照个位来放入“桶”中,然后取出
(2)最高位优先法:和上面的方法很像,就是从最大数的最高位开始,装,取,直到到个位时结束。
2.流程演示
以这组数为例进行演示:2,1,5,21,31,444,23,33,47
(1)第一步
(2)第二步
(3)第三步
3.设计思路
首先我们肯定需要确定“分配”和“收集”的次数,就要先求这组数中的最大值,然后确定最大值是几位数,这样就知道了装和取的次数。
(1)“分配”
我们可以创建一个二维数组来装入数据,长度为10,每个一维数组的长度是待排序数组的长度,因为极端情况下就是将待排序的数全部装入一个桶中。
(2)“收集”
收集就是每次分配结束后,将二维数组中的数取出来覆盖代排序数组中的数。可以创建一个统计数组,来记录每个桶中的装入的数的个数,方便取出数据。(如图所示)
4.代码实现
package com.westmo1.demo2;
import java.util.Arrays;
public class MyDemo6 {
public static void main(String[] args) {
int arr[]={2,1,5,21,31,444,23,33,47,10,903,124,987,100};
SortArray(arr);
System.out.println(Arrays.toString(arr));
}
private static void SortArray(int[] arr) {
//获取数组中的最大值
int max=getMax(arr);
int length = String.valueOf(max).length();
//创建二维数组用来存取数
int[][] temparr = new int[10][arr.length];
//创建统计数组
int[] count = new int[10];
for (int i = 0,n=1; i < length; n=n*10,i++) {
for (int i1 = 0; i1 < arr.length; i1++) {
//获取每个位上的数字
int ys=arr[i1]/n%10;
//将数装入桶中
temparr[ys][count[ys]++]=arr[i1];
}
//取出数据
int index=0;
for (int k = 0; k < count.length; k++) {
if(count[k]!=0){
for (int i1 = 0; i1 < count[k]; i1++) {
arr[index]=temparr[k][i1];
index++;
}
count[k]=0;
}
}
}
}
private static int getMax(int[] arr) {
int max=0;
for (int i = 0; i < arr.length; i++) {
if(max<=arr[i]){
max=arr[i];
}
}
return max;
}
}