基數排序 java程式碼實現
阿新 • • 發佈:2019-01-01
基數排序的基本思想:
設定r個佇列(r為進位制數,例如十進位制r=10),佇列編號分別為0,1,2,… ,r-1;首先按資料元素關鍵字最低位上的數字值依次把n個數據元素分配到r個佇列中(入隊);
然後按照佇列編號從小到大的順序,將佇列中的資料元素收集起來,形成一個新的資料元素序列,這就是第一趟排序。
接著對第一趟基數排序後得到的資料元素序列,再按照資料元素關鍵字的次低位上的數字值依次把各個資料元素再次分配到r個佇列中,然後按照佇列編號從小到大的順序,將佇列中的資料元素收集起來。
如此反覆,經過m(m為資料元素的最大位數,例如1234,m=4)趟基數排序後,就得到了資料元素的有序序列。
需注意的是,對同一個佇列中的資料元素,在收集過程中,應按照先進入佇列的先收集,後進入佇列的後收集的規則進行。
java 程式碼實現如下:
import java.util.LinkedList;
import java.util.Queue;
public class RadixSort {
public int digit(int data,int m,int r){
/*獲取data的第m位數字,該數字為r進位制*/
int i,d;
if(m==0) return data%r;
d=r;
for(i=1;i<m;i++){
d=d*r;
}
return (data/d)%r;
}
public void radixSort(int array[],int n,int m,int r){
/*陣列array中存放關鍵字為m位的r進位制數,陣列大小為n*/
int i,j,k;
Queue[] que=new Queue[r]; //定義一個佇列陣列
for( i=0;i<r;i++){ //初始化佇列陣列
que[i]=new LinkedList<Integer>();
}
for(i=0;i<m;i++){ //進行m趟排序
for (j=0;j<n;j++){
k=digit(array[j], i, r); //取出陣列中第j個數的第i位的值
que[k].add(array[j]); //把陣列中第j個數放入k對應的佇列中
}
j=0;
for(k=0;k<r;k++){ //把所有佇列中的值取出,重新存入陣列array中
while(!que[k].isEmpty()){
array[j++]=(int) que[k].remove();
}
}
for(j=0;j<n;j++){ //輸出每趟排序的結果
System.out.print(array[j]+", ");
}
System.out.println();
}
}
public static void main(String[] args) {
/*使用基數排序法進行排序*/
int array[]=new int[]{983,259,23,173,285,274,11,546,744,372}; //把待排序的數存放在陣列中
int n=array.length;
RadixSort rs=new RadixSort();
rs.radixSort(array, n, 3, 10);
}
}