C 排序演算法之基數排序

2021-08-04 15:53:54 字數 3145 閱讀 8680

基數排序

基數排序是一種非比較的排序演算法,它是以桶排序為基礎的,其思想是「多關鍵字排序」。

基數排序有兩種實現方式:

(1)最高位優先:即先按最高位排成若干子串行,在對每個子串行按次高位排序。

舉例:撲克牌的例子,就是先按花色排成4個子序列,在對每種花色的13張牌進行排序,最終使所有的撲克牌整體有序。

(2)最低位優先:這種方式不必分成子串行,每次排序全體元素都參與。

舉例:撲克牌的例子,就是先按數字將牌分配到13個桶中,然後從第乙個桶開始依次收集;再將收集好的牌按花色分配到4個桶中,然後還是從第乙個桶開始依次收集。經過兩次「分配」和「收集」操作,最終使牌有序。

執行過程:

原始序列: 278  109  063 930  589  184  505  296  008  083

每個元素都是由「數字」組成,數字的範圍是0~9,所以準備10個桶來放元素。如果元素不只有數字組成,例如還有一位是英文本母,那麼按字母這一位進行排序時,要準備26個桶(假設不區分大小寫)。注意這裡所說的「桶」,相當於乙個先進先出的佇列(從上面進,下面出)。

(1)進行第一趟分配和收集,按照最後位。

分配過程如下(注意資料從桶的上面進入):

278最低位是8,放入桶8中:如下圖所示:

109最低位是9,放入桶9中,如下圖所示:

按照這樣的方法,依次(按原始序列順序)將原始序列的每個數放到對應的桶中。第一趟分配過程完成,結果如下圖所示:

收集過程如下:按桶0到桶9的順序收集(注意資料時從桶的下面出)

桶0: 930

桶1: 沒有元素,不收集

桶2: 沒有元素,不收集

桶3: 063,083

...........

桶8: 278,008

桶9: 109,589,269

將每個桶收集的資料依次排開,所以第一趟收集後的結果為:

930  063  083  184  505  278  008  109  589  269

注意觀察,最低位有序了,這就是第一趟基數排序後的結果。

(2)在第一趟排序結果的基礎上,進行第二趟分配和收集:

第二趟分配過程:按中間位分配結果如下圖:

第二趟收集結果為:

505  008  109  930  063  269  278  083  184  589

(3)在第二趟排序結果的基礎上,進行第三趟分配和收集:

第三趟分配過程:按最高位分配結果如下圖:

第三趟收集結果為:

008  063  083  109  184  269  278  505  589  930

**實現如下:

#include #include #include using namespace std;

/*獲得陣列中數值的最大位數*/

int maxbit(const vectorarr)

if (len < c)

len = c;

} return len;

}/*基於int型陣列的基數排序簡單實現*/

void radixsort(vector& arr)

int idx = 0;

for (auto & thisbucket : buckets) //迴圈每個桶中的元素

cout << "第"

radixsort(arr);

cout << "基數排序的結果:";

for (auto x : arr)

cout << x << " ";

cout << endl;

return 0;

}

執行結果如下:

對字串進行基數排序的**實現:

#include #include #include using namespace std;

/*基於字串基數排序的簡單實現*/

void radixsort(vector& arr, int stringlen) }}

/*第一趟個位數字的排序:000 001 512 343 064 125 216 027 008 729

第二趟十位數字的排序:000 001 008 512 216 125 027 729 343 064

第三趟百位數字的排序:000 001 008 027 064 125 216 343 512 729*/

int main()

; radixsort(arr, 3);

for (auto x : arr)

cout << x << " ";

return 0;

}

執行結果如下:

複雜度分析:

時間複雜度為o(d(n+r)):其中d為元素的關鍵字位數,n為元素個數,r為關鍵字的取值範圍,即桶的個數。

空間複雜度為o(r)

演算法 排序之基數排序

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

排序演算法之基數排序

首先從多排序碼排序開始介紹基數排序。以撲克牌排序為例。每張撲克牌有兩個 排序碼 花色和面值。其有序關係為 如果把所有撲克牌排成以下次序 2,a,2,a,2,a,2,a 這就是多排序碼排序。排序後形成的有序序列叫做字典有序序列。一般情況下,假定有乙個n個元素的序列 v 0,v1 vn 1 且每個元素v...

排序演算法之基數排序

如果我們要排序的資料具有多個關鍵字域,那就可以採用基數排序的方法了。基數排序的主要思想是 假如參加排序的元素最高具有d位,有的數沒有d位那麼多,則在其欠缺的高位補0,將元素先按最低位 設最右邊的位為最低位 的值進行排序,然後按次低位進行排序.最後進行最高位的排序。基數排序如果想達到理想的目的,必須滿...