基數排序法 百度百科

2021-05-10 12:20:08 字數 2983 閱讀 2319

「基數排序法」(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群體和網際網路玩家之中獲得了極大...