基数排序(redix sort)又称桶子法,是一个稳定的排序算法。就像有0到9共10个桶子,根据个位、十位、百位...数字来存放这些数据,近而进行排序。
假设有这么一组数据a{15, 7, 26, 43, 13, 72, 10, 31, 17}需要排序。思路如下:
①首先按照个数数大小来放在桶子里。
0:10
1:31
2:72
3:43, 13
4:
5:15
6:26
7:7, 17
8:
9:
②得到的排序结果是:10, 31, 72, 43, 13, 15, 26, 7, 17,然后在按照十位数的大小放进桶子里
0:7
1:10, 13, 15, 17
2:26
3:
4:43
5:
6:
7:72
8:
9:
③最终得到的排序结果是 7, 10, 13, 15, 17, 26, 43, 72
java代码如下:
<span style="white-space:pre"> </span>/**
* @param data 待排序数组
* @param temp 临时数组,数组长度等于data的长度
* @param x 用来控制比较的位数
*/
public static void baseSort(int[] data, int[] temp, int x) {
boolean bool = false;//用来控制递归是否跳出
for (int i = 0; i < data.length; i++) {
if (data[i] / x > 0) {
bool = true;
}
}
if (bool) {
int k = 0;
for (int j = 0; j < 10; j++) {//桶子,按顺序遍历桶子
for (int i = 0; i < data.length; i++) {//遍历数组
if((data[i] / x) % 10 == j) {//除以x然后在对10求余,得到他需要放的桶子
temp[k++] = data[i];//根据桶子0-9按顺序放入temp数组中
}
}
}
//将排序完了的数组放入data中
for (int i = 0; i < temp.length; i++) {
data[i] = temp[i];
}
print(data);//打印数组
baseSort(data, temp, x*10);//往上一位排序,例如先排的个位,接下来就是十位了
}
}
<span style="white-space:pre"> </span>public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
System.out.println();
}
在上面代码排序中是不能有负数的,如果有负数便不能直接调用上面的代码,需调用以下代码,不过这样之后便变得不稳定了:
<span style="font-size:18px;"><span style="white-space:pre"> </span>public static void base(int[] data){
int m = 0;
int n = 0;
int k = 0;
int j = 0;
int index = 0;
for (int i = 0; i < data.length; i++) {
if(data[i] > 0){
m++;
} else {
n++;
}
}
int[] data1 = new int[m];
int[] data2 = new int[n];
int[] temp1 = new int[m];
int[] temp2 = new int[n];
for (int i = 0; i < data.length; i++) {
if(data[i] > 0){
data1[k++] = data[i];
} else {
data2[j++] = -data[i];
}
}
baseSort(data1, temp1, 1);
baseSort(data2, temp2, 1);
if(m > 0){
for (int i = data2.length -1; i >= 0; i--) {
data[index++] = -data2[i];
}
}
if(n > 0){
for (int i = 0; i < data1.length; i++) {
data[index++] = data1[i];
}
}
print(data);
}</span>