線性排序之 基數排序

2021-06-25 13:39:31 字數 1551 閱讀 5243

基數排序, radix sorting, 也叫bin sort, bucker sort, 基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

基數排序的方式可以採用lsd(leastsgnificant digital)或msd(most sgnificant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。

以lsd為例,假設原來有一串數值如下所示:

73, 22, 93, 43, 55, 14, 28, 65, 39, 81

首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:01

2345

6789

8122

7314

5528

3993

6543

接下來將這些桶子中的數值重新串接起來,成為以下的數列:

81, 22, 73, 93, 43, 14, 55, 65, 28, 39

接著再進行一次分配,這次是根據十位數來分配:01

2345

6789

1422

3943

5565

7381

9328

接下來將這些桶子中的數值重新串接起來,成為以下的數列:

14, 22, 28, 39, 43, 55, 65, 73, 81, 93

這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。

lsd的基數排序適用於位數小的數列,如果位數多的話,使用msd的效率會比較好,msd的方式恰與lsd相反,是由高位數為基底開始進行分配,其他的演 算方式則都相同。

索引的計算index =( original[j] %10^i)  /  10^(i-1)  // i=1代表各位數, i =2 代表百位數, 依次類推。。。

1. 使用c++實現lsd

#include #include #include using namespace std;

const int len = 100+2;

const int highpos = 4;

class radixsort //計數排序類

;

radixsort::radixsort():length(len),pos(highpos)

} }}

int main()

{

radixsort *pcountsort = new radixsort();

cout<<"排序前:"cout<<"排序後:"《注意: 上面的程式如果只是將

if(int i =1; i 0; 1--) 是只能在所有變數位數相同才能得到正確結果, 否則是不可以的。

如果是我要實現msd, 有種辦法是使用迴圈遞迴, 從9到0, 然後依次迭代, 或者在第一次的各個bucket中採取其他的排序方法, 進行混合排序。

線性時間排序之基數排序

標頭檔案 number.h pragma once include include include using namespace std class number include number.h number number int num number number void number nu...

(1 3 6 1)線性排序 基數排序

當序列中元素範圍比較大時,就不適合使用計數排序。針對這種情況,就有了基數排序 radix sort 這是一種按位排序。它仍然是以計數排序為基礎。基數排序的基數 十進位制數的基數自然是10,二進位制的基數自然是2。通常有兩種按位排序策略 1.高位優先法 most significant digit f...

演算法 排序之基數排序

基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為o n 舉個例子 現在我們將一些3 多 位數排序,如果你說直接判斷就好的話,那你就太天真了,因為那就又變成看o nlgn 或者o n 如何能降低時間複雜度變成o n 呢?那就要使用線性時間...