10.基數排序
10.1 算法思想
基數排序是對桶排序的擴展。
第一類:最低位優先法,簡稱LSD法:先從最低位開始排序,再對次低位排序,直到對最高位排序后得到一個有序序列;
第二類:最高位優先法,簡稱MSD法:先從最高位開始排序,再逐個對各分組按次高位進行子排序,循環直到最低位。(位沒有數的話,補0)
這里以LSD為例,由于待排序元素每一位上的數字的取值范圍是0—9,因此每按照某一位,需要10個桶,這樣每一位上相同的數字會分配到一個桶里。
10.2 算法過程
假設有一未排序數組:
3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
首先根據個位數的數值,在遍歷數值時將它們分配至編號0到9的桶中:
0:50
1:
2: 2
3: 3
4: 44,4
5: 5,15
6:36,26,46
7:47,27
8:38,48
9:19,
第二步
接下來將這些桶中的數值重新串接起來,成為以下的數列:
50,2,3,44,4,5,15,36,26,46,47,27,38,48,19
接著再進行一次分配,這次是根據十位數來分配:
0:2,3,4,5
1:15,19
2:26,27
3:36,38
4:44,46,47,48
5:50,
6:
7:
8:
9:
第三步
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
2,3,4,5,15,19,26,27,36,38,44,46,47,48,50
這時候整個數列已經排序完畢。
如果排序的對象有三位數以上,則持續進行以上的動作直至最高位數為止。
10.3 python代碼
def
getbit
(
num
,
i
)
:
# 獲取元素第i位的數
return
(
num
%
(
i
*
10
)
-
(
num
%
i
)
)
//
i
def
getMax
(
numList
)
:
# 獲取數組中的最大值
if
len
(
numList
)
==
1
:
return
numList
[
0
]
maxNum
=
numList
[
0
]
for
i
in
range
(
len
(
numList
)
)
:
if
numList
[
i
]
>
maxNum
:
maxNum
=
numList
[
i
]
return
maxNum
def
radixSort
(
numList
)
:
if
len
(
numList
)
==
0
or
len
(
numList
)
==
1
:
return
numList
maxNum
=
getMax
(
numList
)
bitCount
=
0
index
=
1
while
maxNum
//
index
:
bitCount
+=
1
index
*=
10
currentBit
=
1
# 統計一下最大值的bitCount(有多少位),因為比較多少次,是有最大值的位數決定的
while
currentBit
<=
10
**
(
bitCount
-
1
)
:
# 開始循環的進行每一個位的比較
res
=
[
]
buckets
=
[
[
]
for
i
in
range
(
10
)
]
# 桶排序
for
i
in
numList
:
currentBitNum
=
getbit
(
i
,
currentBit
)
buckets
[
currentBitNum
]
.
append
(
i
)
for
i
in
range
(
10
)
:
for
j
in
range
(
len
(
buckets
[
i
]
)
)
:
res
.
append
(
buckets
[
i
]
[
j
]
)
numList
=
res
currentBit
*=
10
return
numList
numlist
=
[
12
,
3
,
45
,
3543
,
214
,
1
,
4553
]
print
(
radixSort
(
numlist
)
)
# 輸出結果為:[1, 3, 12, 45, 214, 3543, 4553]
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
