package com.lzw.struct.gjsort;
import java.util.Arrays;
import java.util.LinkedList;
/**
* 基數排序
*
* @author 李趙偉 Create: 2:44:21 PM Mar 16, 2009
*/
public class RadixSort{
private int[] iarr;
private int size;
private LinkedList[] radixes;
private int Radix;
public RadixSort(int[] iarr, int Radix){
this.iarr = iarr;
this.Radix = Radix;
this.size = iarr.length;
}
public void display(){
System.out.println(Arrays.toString(iarr));
}
/**
* 使用鏈表進行排序
*/
public void radixSort(){
this.radixes = new LinkedList[Radix];
for(int l = 0; l < Radix; l++)
this.radixes[l] = new LinkedList<Integer>();
radix();
}
private void radix(){
for(int i = 0; i < Radix; i++){
radix(i);
newArr();
}
}
private void radix(int i){
int num, index;
//構造數組,大小等於10(基數)
for(int l = 0; l < Radix; l++)
this.radixes[l].clear();
for(int j = 0; j < size; j++){
num = iarr[j];
//尋找 個位-> 十位 -> 百位 -> 千位 -> ……
for(int k = 1; k < i; k++)
num /= 10;
index = num % 10;
radixes[index].add(iarr[j]);
}
}
/**
* 合併構成新的數組
*/
private void newArr(){
LinkedList<Integer> ll;
int len = -1;
for(int i = 0; i < Radix; i++){
ll = (LinkedList<Integer>)radixes[i];
for(int j = 0; j < ll.size(); j++){
iarr[++len] = ll.get(j).intValue();
}
}
}
//------------------------------------------------------------------------------------
/**
* 基數排序算法
*/
public void sort(){
int[] tmparr = new int[size];
int[] count = new int[Radix];//用於統計每個基數出現的次數
int N = 1; //用於定位個位-> 十位 -> 百位 -> 千位 -> ……
int index;
for(int i = 0; i < Radix; i++){
System.arraycopy(iarr, 0, tmparr, 0, size);
Arrays.fill(count, 0);
index = 0;
for(int j = 0; j < size; j++){
index = (tmparr[j] / N) % Radix;
count[index]++;
}
//確定每一個數字在數組的起始位置
for(int j = 1; j < Radix; j++){
count[j] = count[j] + count[j - 1];
}
index = 0;
for(int j = size - 1; j >= 0; j--){
index = (tmparr[j] / N) % Radix;
iarr[--count[index]] = tmparr[j];
}
//1*10, 10*10, 100*10, 1000*10, ...
N *= Radix;
}
}
//------------------------------------------------------------------------------------
}