2.執行結果
3.演算法實現
1.基數排序是在箱排序的基礎之上進行擴充套件和完善的
2.通過判斷待排序的陣列中的位數,決定進行建立箱子的個數和遍歷的次數.
例如:待排序中最多的位數為3位,那麼就需要建立三個箱子(當然也可以建立兩個,進行復用,記得復用之前要清除之前的箱子),這裡我就不復用了.那麼需要進行遍歷三次
3.開始排序(就是遍歷裝箱操作)
3.1:第一次遍歷待排序的陣列.進行第一次裝箱(箱子a),按照個數進行裝到對應的箱子.
3.2:第二次順序遍歷前面的箱子(箱子a),進行第二次裝箱(箱子b),按照十位數進行裝到對應的箱子中.
3.3:第三次順序遍歷前面的箱子(箱子b),進行第三次裝箱(箱子c),按照百位數進行裝到對應的箱子中.
到了這裡已經排序完成,還差最後一步.
4.組裝資料,順序遍歷最後一次的箱子(箱子c).儲存到乙個陣列中,此時陣列中的資料就是已經排序好的.
例如:上面的箱子,順序遍歷這個箱子a儲存到箱子b中.(按照十位儲存)
讀取0號桶:
第乙個數:200, 十位為0, 儲存箱子b中0號桶[200]
第二個數:100, 十位為0, 儲存箱子b中0號桶[200,100]
讀取1號桶:
第乙個數:211, 十位為1, 儲存箱子b中1號桶[211]
讀取2號桶:
沒有值跳過
讀取3號桶:
第乙個數:143, 十位為4, 儲存箱子b中4號桶[143]
第二個數:433, 十位為3, 儲存箱子b中3號桶[433]
讀取4號桶:
第乙個數:84, 十位為4, 儲存箱子b中8號桶[84]
第二個數:134, 十位為3, 儲存箱子b中3號桶[433,134]
第三個數:534, 十位為3, 儲存箱子b中3號桶[433,134,534]
第四個數:994, 十位為9, 儲存箱子b中9號桶[994]
…後面的就不一一舉例了.直到遍歷結束.
//鍊錶結點 順序儲存箱子中數值,這樣就可以不用限制資料量.
typedef
struct snodenode;
//箱子中的每個鍊錶
typedef
struct listlinklist;
//箱子列表
typedef
struct radixboxrb;
//入隊
void
insertlist
(linklist *list,
int value)
;//列印佇列
void
loglist
(linklist *list)
;//列印箱子
void
logradixbox
(rb rb)
;//列印箱子--陣列型別
void
logradixboxarray
(rb rb)
;//裝箱操作
//type:1->除數為1*10 2:除數為2*20
void
enradixbox
(int type,rb rb,
int value)
;//基數排序
void
radixsort
(void
);
//列印佇列
void
loglist
(linklist *list)
else
p=p->next;
}printf
("]\n");
}}//列印箱子
void
logradixbox
(rb rb)
logradixboxarray
(rb)
;printf
("********************************\n");
}//列印箱子--陣列型別
void
logradixboxarray
(rb rb)
else
printf
(",%d"
,p->value)
; p=p->next;}}
printf
("]\n");
}//入隊
void
insertlist
(linklist *list,
int value)
//3.將新的結點插入鍊錶
if(list->header==
null)if
(list->rear==
null
)else
}//裝箱操作
//type->0:個數,1:十位,2:百位的餘數
void
enradixbox
(int type,rb rb,
int value)
//2.計算位置
//134: 134%10
//134: (134/10)%10
//134: (134/100)%10
//(value/(pow(10,type)))%10
int position=((
int)
(value/
(int
)pow(10
, type)))
%10; linklist *list= rb.boxs[position]
;insertlist
(list,value);}
//基數排序
void
radixsort
(void);
printf
("未排序:");
logarray
(array, n)
;//2.首先要知道陣列中最大的是幾位數,就需要幾個箱子,從個位到最高位順序裝箱
//初始化箱子
rb rbs[3]
;//初始化三個箱子
for(i=
0;i<
3;i++)}
//3.開始裝箱
for(i=
0;i<
3;i++
)logradixbox
(rbs[i]);
}else}}
logradixbox
(rbs[i]);
}}//4.遍歷最後乙個箱子裝入陣列,就是排好序的
node *p;
i=0;
for(j=
0;jprintf
("已排序:");
logarray
(array, n)
;}
我這裡迴圈遍歷的時候,第一次是遍歷待排序的資料,然後進行裝箱,剩下的順序遍歷,是遍歷上一次的箱子.
優化點:
1.建立箱子的時候,可以建立乙個個箱子
2.每次裝完箱子操作後,可以先順序遍歷箱子,順序儲存到陣列中.然後下一次遍歷的時候,是遍歷裝箱後的陣列.這樣就是每次都是遍歷陣列,進行裝箱.
3.在決定迴圈幾次的時候,我這裡知道待排序中的陣列,最大的是3位數,
3.1這裡可以寫乙個快速查詢方法,尋找最大位數,或者最大值.
3.2或者是在第一次裝箱的時候,同時查詢最大位數(n)也可以,這樣後面迴圈的就是再進行(n-1)次.
基數排序 C
首先我們引入乙個多關鍵排序的概念 多關鍵字排序 假如現在有乙個員工表,要求按照薪資排序,年鈴相同的員工按照年齡排序。比如氣泡排序就是一種穩定排序,堆排序就是不穩定的排序,品,你細細的品 那麼對32,13,94,52,17,54,93排序,是否可以看做多關鍵字排序?比如32 13 52排序,先看個位2...
基數排序(c )
題目描述 根據輸入,輸出基數排序的每趟排序結果。輸入格式 輸入數字為正整數,先輸入排序數字個數,然後輸入需要排序的數字序列。輸出 每趟排序結果。要求 程式需要實現排序,其他可以使用stl包。示例測試集 輸入 8 2343666 152310 5594 592783278 輸出 152310 2343...
c 基數排序
題目和我的前幾個排序一樣 include using namespace std int arrlength int arr 測出int陣列的長度 遞迴,找出陣列最大的值 param arrays 陣列 param l 左邊界,第乙個數 param r 右邊界,陣列的長度 return int fi...