/*
稳定性:[稳定](不稳定的算法结构:如果有两个相同的元素5,会导致第一个5和第二个5的位置发生改变)
idea:与其他7中排序算法不同,他不需要比较关键字的大小
根据比较关键字中各位的值,通过对排序的N个元素进行若干趟“分配”和“收集”来实现排序的
*/
package seven_happy;
import java.util.ArrayList;
import java.util.List;
public class Code_Demo {
/**
* author: Ain
* model: write a code about selection_sort
* date:2016-3-9
*/
//
定义变量值
private static final int [] a = { 0, 3, 1, 8, 7, 2, 5, 4, 6, 9 };
private static final String OUTPUT_ago = "基数排序之前的顺序";
private static final String OUTPUT_AFTER = "基数排序之后的顺序";
//
主程序入口
public static void main(String[] args) {
System.out.print(OUTPUT_ago);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
// 调用基数排序方法
sort(a);
System.out.println();
System.out.print(OUTPUT_AFTER);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
//
基数排序方法
private static void sort(int[] array) {
// 找到最大数,确定要排序几趟
int max = 0;
for (int i = 0; i < array.length; i++) {
if (max < array[i]) {
max = array[i];
}
}
// 判断位数
int times = 0;
while (max > 0) {
max = max / 10;
times++;
}
// 建立十个队列
List<ArrayList> queue = new ArrayList<ArrayList>();
for (int i = 0; i < 10; i++) {
ArrayList queue1 = new ArrayList();
queue.add(queue1);
}
// 进行times次分配和收集
for (int i = 0; i < times; i++) {
// 分配
for (int j = 0; j < array.length; j++) {
int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
ArrayList queue2 = queue.get(x);
queue2.add(array[j]);
queue.set(x, queue2);
}
// 收集
int count = 0;
for (int j = 0; j < 10; j++) {
while (queue.get(j).size() > 0) {
ArrayList<Integer> queue3 = queue.get(j);
array[count] = queue3.get(0);
queue3.remove(0);
count++;
}
}
}
}
}