python演算法 基數排序

2021-10-07 21:59:28 字數 3610 閱讀 8091

基數排序也是非比較的排序演算法,基數排序也稱為桶排序。

基數排序就是將待排序資料拆分成多個關鍵字進行排序,也就是說,基數排序的實質是多關鍵字排序。多關鍵字排序的思路是將待排資料里德排序關鍵字拆分成多個排序關鍵字; 第1個排序關鍵字,第2個排序關鍵字,第3個排序關鍵字…然後,根據子關鍵字對待排序資料進行排序。

基數排序又稱為「桶子法」,從低位開始將待排序的數按照這一位的值放到相應的編號為0~9的桶中。等到低位排完得到乙個子串行,再將這個序列按照次低位的大小進入相應的桶中,一直排到最高位為止,陣列排序完成。

分類

lsd——從低位向高位排

msd——從高位向低位排

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

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

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

例如:73個位數是3,放到3號桶,22個位數是2,放到2號桶…

個位數  元素值

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相反,是由高位數為基底開始進行分配,但在分配之後並不馬上合併回乙個陣列中,而是在每個"桶子"中建立"子桶",將每個桶子中的數值按照下一數字的值分配到"子桶"中。在進行完最低位數的分配後再合併回單一的陣列中。

'''

先建立10個空桶,用於表示個位上,十位上,...,的數,先按個位數分好桶,

個位數=0進0號桶,個位數=1進1號桶,...,然後再將數歸位,再按十位數進行分桶,

分好後歸位,再按百位數進行分桶...,以此類推

'''def

radix_sort

(arr)

: maxi =

max(arr)

# 先找出最大數

d =0# d表示最大數的位數(即迴圈的次數)

while

10** d <= maxi:

buckets =[[

]for _ in

range(10

)]# 建立 10個空桶

for value in arr:

# 分桶, 對於895,當d=1時,執行第二次迴圈,看的是十位上的數,就需要取9出來分到9號桶

# d=0時,取5,895//1->895 , 895%10->5

# d=1時,取9,895//10->89 , 89%10->9

# d=2時,取8,895//100->8 , 8%10->8

# 規律:1可以看成10的0次方,10可以看成10的1次方,100可以看成10的2次方,即10的d次方

digit =

(value //(10

** d))%

10# 分別取出個位上、十位上、百位上...等的數

buckets[digit]

# 分桶完成

arr.clear(

)for buc in buckets:

# buc表示每個桶,是個一維列表

arr.extend(buc)

# arr.extend(buc):表示把兩個一維列表合併為乙個一維列表

d +=

1if __name__ ==

'__main__'

: numbers =[10

,20,1

,2,5

,8,999,65

,63,98

,587

,695,21

,4] radix_sort(numbers)

print

(numbers)

補充:二維列表的遍歷

buckets=[[

1,2,

3],[

2,4,

6],[

7,8,

9]]for buc in buckets:

print

(buc)

輸出結果:

[1,

2,3]

[2,4

,6][

7,8,

9]

遍歷二維列表中的每個元素

# 第一種方法遍歷

list=[

[1,2

,3],

[4,5

,6],

[7,8

,9]]

for i in

range

(len

(list))

:for j in

range

(len

(list

[i])):

print

(list

[i][j])

輸出結果:12

3456

789

# 第二種方式遍歷:

list=[

[1,2

,3],

[4,5

,6],

[7,8

,9]]

for arr in

list

:for element in arr:

print

(element)

輸出結果:12

3456

789

arr=[1

,2,3

]buc=[4

,5,6

]arr.extend(buc)

# 把 buc列表中的元素新增到 arr列表中

print

(arr)

輸出結果:[1

,2,3

,4,5

,6]

arr=[1

,2,3

]buc=[4

,5,6

]# 把 buc列表新增到 arr列表中

print

(arr)

輸出結果:[1

,2,3

,[4,

5,6]

]

基數排序演算法

include stdafx.h include iostream include math.h using namespace std struct radixsort 建立迴圈鍊錶 radixsort creatlink else le ls ls new radixsort 為下乙個節點在堆記...

基數排序演算法

以下內容為程式 int quicksort int p,int n extern int insertsort int p,int n static int partition int p,int n,int m static int quick sort int p,int n 快速排序演算法在 ...

基數排序演算法

經典排序演算法 基數排序radix sort 原理類似桶排序,這裡總是需要10個桶,多次使用 首先以個位數的值進行裝桶,即個位數為1則放入1號桶,為9則放入9號桶,暫時忽視十位數 例如 待排序陣列 62,14,59,88,16 簡單點五個數字 分配10個桶,桶編號為0 9,以個位數數字為桶編號依次入...