1. 程式人生 > >排序之基數排序

排序之基數排序

算法 大小 ble 這一 index eof sta 根據 next

基數排序也是一種不基於比較的排序方法,它的思想是這樣的:假設有m個數據,先根據個位數大小對這m個數據進行排序,得到一個新的序列;然後根據十位數大小對這m個數據進行排序,又得到一個新的序列;然後再根據百位、千位,依次類推,直至最高位,最後得到的序列就是有序的序列。那麽對每一位的排序是如何進行的呢?位排序的思想是這樣的:假設每位數據的範圍是0到9,那麽就創建10個桶(可用數組表示),如果該位數是0,那麽就放到0號桶內,是1就放到1號桶內.....,最後從0號桶到9號桶,依次取出桶內的數據,就可以得到一個序列,這裏同一個桶內的數據順序任意,處於同一個桶內的數據,說明它們這一位的數是相同的。先用圖示舉一個例子:

技術分享

基數排序的算法描述如下:

radix_sort(A,d)//1是最低位,d是最高位

1、for i=1 to d

2、  do use a stable sort to sort array A on digit i

算法描述很簡單,但是裏面的細節還是挺多的,首先,我們要創建桶,這裏桶是用一個數組表示,桶內元素類型是一個自定義的類,類可以存儲數組A中的數據,而為了取“位”的方便,這裏將數組A中的數據均用String類型表示,對圖中序列進行基數排序的代碼示例圖下:

class stableNode{
    String val=null;
    stableNode next=null;
    
public stableNode(String val){ this.val=val; } } public class Test{ public static void main(String[] args)throws InterruptedException{ String[] value={"329","457","657","839","436","720","355"}; radix_sort(value); System.out.println(); } static void
radix_sort(String[] value){ //創建一個盒子,用於存放數據 stableNode[] stable=new stableNode[10];//0 to 9 int i=0; //因為要從最低位開始排序,所以要對數據進行翻轉,使其高低位交換位置 for(i=0;i<value.length;i++){ value[i]=(new StringBuilder(value[i]).reverse()).toString(); } for(String str:value){ System.out.print(str+" "); } System.out.println(); //註意這裏,為了演示方便,將所有數據的位數都設成一樣的 int maxLen=value[0].length(); int index=0; int k=0; for(k=0;k<maxLen;k++){//進行數字位的遍歷 for(i=0;i<value.length;i++){//遍歷待排序的數組 //為了演示方便,這裏假定所有數據的位數是相同的!!! //也就是說,如果是百位數,那麽全是百位數 //如果數的位數不同,則需要進一步修改排序細節,但是思想是相同的 index=Integer.valueOf(value[i].substring(k,k+1)); build_stable(stable,index,value[i]); } sort_result(stable,value); } for(i=0;i<value.length;i++){ value[i]=(new StringBuilder(value[i]).reverse()).toString(); } for(String str:value){ System.out.print(str+" "); } } //將桶內的數據從新放到數組裏面,從而得到一個新的序列 static void sort_result(stableNode[] stable,String[] value){ int k=0,i=0; stableNode root=null; for(i=0;i<stable.length;i++){//其實是i<10即可 root=stable[i]; while(root!=null){ value[k++]=root.val; root=root.next; } } //全部賦值為空,以待下次使用 for(i=0;i<stable.length;i++){ stable[i]=null; } } //創建桶,根據基數,將數據放到何時的桶裏面 static void build_stable(stableNode[] stable,int index,String value){ if(stable[index]==null){ stable[index]=new stableNode(value); }else{ stableNode list=stable[index]; while(list.next!=null){ list=list.next; } list.next=new stableNode(value); } } static void printArray(int[] array){ for(int val:array){ System.out.print(val+" "); } System.out.println(); } }

基數排序分析:時間復雜度是O(max_digit*(radix_size+n)),其中max_digit是每位中的最大數值,在這裏是9,radix_size是0到k之間的k中可能取值這裏是0到9共10中可能取值。由於需要建立桶,且要盛放序列A中的所有數據,所以空間復雜度是O(n)

排序之基數排序