很久之前写过关于基于基数排序的代码实现。那时候还年轻不懂事,最近无意中与同事聊起,把百度基数排序看了一遍,又想起之前敲过的代码,回头翻出来看了一遍,发现还很粗糙,完全不能看的节奏。
我以前敲代码用到链表,发现还不错,就想着用链表去实现一遍。好久没用链表了,都有点忘了,花了些时间是把思维理清。链表LinkList采用的是双端链表,从链表的尾部添加,头部拿出来,每拿出一个就去掉一个Link(这是为了保存数据的稳定性)。
public class RadixSort {
private static LinkList[] linkList= new LinkList[10];
static{
for(int i = 0 ; i < 10 ; i++){
linkList[i] = new LinkList();
}
}
public static void clear(){
for(int i = 0 ; i < 10 ; i++){
linkList[i].clear();
}
}
/** 与百度基数排序一致的想法实现*/
public static void sort(int[] number,int q)
{
int num = number.length;
int d = 1;
int t = 0;
int temp;
while(q > 0){
for(int i = 0 ; i < num ; i++){
temp = (number[i]/d) % 10;
linkList[temp].insertLast(number[i]);
}
for(int k = 0 ; k < 10 ; k++){
while((temp = linkList[k].popFirst())!= -1){
number[t++] = temp;
}
}
t = 0;
d = d*10;
q--;
}
clear();
}
}public static void sort(int[] number ){
int len = number.length;
int[] sorted = new int[len];//已排好序的数组
int num = len;//还剩多少要排序的,动态变
int d = 1; //位
int temp;
int num1 = num;//每一轮要排序的长度
int t ;
while(num1 > 0 ){
for(int i = 0 ; i < num1 ; i++){
temp = number[i] / d;
if(temp == 0){
sorted[len - num] = number[i];
num --;
}else{
temp = temp % 10;
linkList[temp].insertLast(number[i]);
}
}
num1 = num;
t = 0;
for(int k = 0 ; k < 10 ; k++){
while((temp = linkList[k].popFirst())!= -1){
number[t++] = temp;
}
}
d = d * 10;
}
clear();
//number = sorted;这样子是不行的
for(int i = 0 ; i < len ; i++){
number[i] = sorted[i];
}
}/**
* 不知道位数的基数排序
*/
public static void sort(int[] number ){
int len = number.length;//数组长度
int num = 0 ;//已排好序的个数
int d = 1; //位
int temp; //临时变量,看环境而变
int t ; //临时变量,看环境而变
while(num < len ){
for(int i = num ; i < len ; i++){
temp = number[i] / d;
if(temp == 0){
number[num++] = number[i];
}else{
temp = temp % 10;
linkList[temp].insertLast(number[i]);
}
}
t = num;
for(int k = 0 ; k < 10 ; k++){
while((temp = linkList[k].popFirst())!= -1){
number[t++] = temp;
}
}
d = d * 10;
}
clear();
}/**
* 已知道位数的基数排序
*/
public static void sort(int[] number,int maxd ){
int len = number.length;//数组的长度
int num = 0 ;//已排好序的个数
int d = 1; //位
int temp; //临时变量,看环境
int temp1 ;//临时变量,看环境
for(int j = 0 ; j < maxd; j++){
for(int i = num ; i < len ; i++){
temp = number[i] / d;
if(temp == 0){ //已经没有更多位了
number[num++] = number[i];
}else{
temp = temp % 10;
linkList[temp].insertLast(number[i]);
}
}
temp1 = num;
for(int k = 0 ; k < 10 ; k++){
while((temp = linkList[k].popFirst())!= -1){
number[temp1++] = temp;
}
}
d = d * 10;
}
clear();
}public static int getRadix(int[] number){
int temp = number[0];
int index = 0;//位数
/** 查出最大的数 */
for(int i = 1 ; i < number.length ; i++){
if(temp < number[i]){
temp = number[i];
}
}
do{
index++;
temp /= 10;
}while(temp > 0);
return index;
}public class Link {
public int idata;
public Link next = null;
public Link(int idata){
this.idata = idata;
}
}
/** 采用在尾部last添加,从头部first拿出*/
public class LinkList {
public Link first = null;
public Link last = null;
public LinkList(){}
public void insertLast(int idata){
Link link = new Link(idata);
if(last == null){
first = link;
}else{
last.next = link;
}
last = link;
}
/**如果没有数则返回-1 */
public int popFirst(){
if(first != null){
if(last == first){
last = null;
}
int temp = first.idata;
first = first.next;
return temp;
}
return -1;
}
public void clear(){
first = null;
last = null;
}
public void print(){
Link temp = first;
while(temp!= null){
System.out.print(temp.idata + " ");
temp = temp.next;
}
}
}