基數排序是基於桶式排序的變種,主要是為了通過多次遍歷減少空間占用(效果相當顯著)。其思路可以描述為:
1.首先待排序的序列要滿足基數排序的特徵,比如有「基數」的概念(整數和字串都可以套用)
2.建立乙個大小為「基數」的陣列,陣列每個元素是乙個佇列(為了節省空間應該使用鍊錶實現)
3.根據序列的「位數」決定遍歷的次數m,每次遍歷相當於按某一位做桶式排序。重複的元素push到佇列中。
4.m次遍歷後排序完成,最後一次遍歷輸出結果。因為資料不是按線性結構儲存。
下面是我的實現,採用vector結構:
1 #include2 #include3 #include45using
namespace
std;67
/*8* n is the input intergers
9* b is base
10* w is the intergers's max width
11*/
12void buildvector(vectorint> >&arr,int
b)1324}
25void radixsort(vectorint> >&arr,int b,int
w)2640}
41swap(arr,brr);42}
43}44void show(vectorint> >&arr)
4555 ++itv;56}
57 cout<5960
intmain()
61
注意幾點:
1.每次遍歷之後實際上要借助原始陣列輸出,以便下次遍歷可以直接遞迴。我這裡偷懶用了個swap操作。
2.時間複雜度=(o(n)+o(基數))*o(位數)
3.也可以不借助鍊錶,僅用陣列實現。每次遍歷前預處理序列,找到遍歷的時候每一位將會重複的元素個數,計算出該位在陣列中的起始下標即可。
演算法 排序之基數排序
基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為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,將元素先按最低位 設最右邊的位為最低位 的值進行排序,然後按次低位進行排序.最後進行最高位的排序。基數排序如果想達到理想的目的,必須滿...