「基數排序法」(radix sort)則是屬於「分配式排序」(distribution sort),基數排序法又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。
解法基數排序的方式可以採用lsd(least significant digital)或msd(most significant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。
以lsd為例,假設原來有一串數值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:
1 81
2 22
3 73 93 43
4 14
5 55 65
8 28
9 39
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接著再進行一次分配,這次是根據十位數來分配:
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。
lsd的基數排序適用於位數小的數列,如果位數多的話,使用msd的效率會比較好,msd的方式恰與lsd相反,是由高位數為基底開始進行分配,其他的演算方式則都相同。
實作* c
#include
#include
int main(void) ;
int temp[10][10] = ;
int order[10] = ;
int i, j, k, n, lsd;
k = 0;
n = 1;
printf("/n排序前: ");
for(i = 0; i < 10; i++)
printf("%d ", data);
putchar('/n');
while(n <= 10) ;
radixsort.sort(data, 10);
for(int i = 0; i < data.length; i++) {
system.out.print(data[i] + " ");
vara:array[0..100]of longint;
min,max,n,i,tmp:longint;
begin
fillchar(a,sizeof(a),0);
min:=maxlongint;
max:=-min;//max和min是數字的最大和最小邊界。
readln(n);
for i:=1 to n do begin
read(tmp);
inc(a[tmp]);//tmp的出現次數+1
if tmp>max then max:=tmp;
if tmpend;
for i:=min to max do
while a<>0 do begin//如果i這個數字還沒有列印完,就繼續列印
dec(a);//把i列印並且次數-1.
write(i,' ');
end;
writeln;
end.
int maxbit(int data,int n) //輔助函式,求資料的最大位數
int d = 0;
int * tmp = new int[n];
for(int i = 0 ;i < n;i++)
tmp[i]= data[i];
for(int i = 0;i < n;i++)
int p =1;
while(tmp[i]/10 > 0)
p++;
tmp[i]= tmp[i]/10;
if(d < p) d = p;
delete tmp;
return d;
void radixsort(int data,int n) //基數排序
int d = maxbit(data,n);
int * tmp = new int[n];
int * count = new int[10]; //計數器
int i,j,k;
int radix = 1;
for(i = 1; i<= d;i++) //進行d次排序
for(j = 0;j < 10;j++)
count[j] = 0; //每次分配前清空計數器
for(j = 0;j < n; j++)
k = (data[j]/radix)%10; //統計每個桶中的記錄數
count[k]++;
for(j = 1;j < 10;j++)
count[j] = count[j-1] + count[j]; //將tmp中的位置依次分配給每個桶
for(j = n-1;j >= 0;j--) //將所有桶中記錄依次收集到tmp中
k = (data[j]/radix)%10;
count[k]--;
tmp[count[k]] = data[j];
for(j = 0;j < n;j++) //將臨時陣列的內容複製到data中
data[j] = tmp[j];
radix = radix*10;
delete tmp;
delete count;
AnimateWindow 百度百科
animatewindow 開放分類 程式設計 計算機 api 函式功能 該函式能在顯示與隱藏視窗時能產生特殊的效果。有兩種型別的動畫效果 滾動動畫和滑動動畫。函式原型 bool animatewindow hwnd hwnd,dword dwtime,dword dwflags 引數 hwnd 指...
WCF百度百科
根據微軟官方的解釋,wcf 之前的版本名為 indigo 是使用託管 建立和執行面向服務 service oriented 應用程式的統一框架。它使得開發者能夠建立乙個跨平台的安全 可信賴 事務性的解決方案,且能與已有系統相容協作。wcf是微軟分布式應用程式開發的集大成者,它整合了.net平台下所有...
Mashup 百度百科
mashup是糅合,是當今網路上新出現的一種網路現象,將兩種以上使用公共或者私有資料庫的web應用,加在一起,形成乙個整合應用。一般使用源應用的api介面,或者是一些rss輸出 含atom 作為內容源,合併的web應用用什麼技術,則沒有什麼限制。mashup在geek群體和網際網路玩家之中獲得了極大...