每日一練 基數排序

2021-09-26 09:54:05 字數 2549 閱讀 1882

基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

第一步

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

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

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

01 81

2 22

3 73 93 43

4 14

5 55 6567

8 28

9 39

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

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

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

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

時間複雜度:

設待排序列為n個記錄,d個關鍵碼,關鍵碼的取值範圍為radix,則進行鏈式基數排序的時間複雜度為o(d(n+radix)),其中,一趟分配時間複雜度為o(n),一趟收集時間複雜度為o(radix),共進行d趟分配和收集。 空間效率:需要2*radix個指向佇列的輔助空間,以及用於靜態鍊錶的n個指標。

python實現方法:

import random

def inputarr(data,size):

for i in range(size):

data[i]=random.randint(0,999) #設定 data 值最大為 3 位數

def showdata(data,size):

for i in range(size):

print('%5d' %data[i],end='')

print()

def radix(data,size):

n=1 #n為基數,從個位數開始排序

while n<=100:

tmp=[[0]*100 for row in range(10)] # 設定暫存陣列,[0~9位數][資料個數],所有內容均為0

for i in range(size): # 對比所有資料

m=(data[i]//n)%10 # m為 n 位數的值,如 36 取十位數(36/10)%10=3

tmp[m][i]=data[i] # 把 data[i] 的值暫存在 tmp 中

k=0for i in range(10):

for j in range(size):

if tmp[i][j] != 0: # 因為一開始設定 tmp =,故不為 0 者即為

data[k]=tmp[i][j] # data 暫存在 tmp 中的值,把 tmp 中的值放

k+=1 # 回 data[ ]裡

print('經過%3d位數排序後:' %n,end='')

showdata(data,size)

n=10*n

data=[0]*100

size=int(input('請輸入數列的大小(100以下):'))

print('您輸入的原始資料是:')

inputarr (data,size)

showdata (data,size)

radix (data,size)

輸出:

請輸入數列的大小(100以下):11

您輸入的原始資料是:

372 82 45 931 982 171 74 587 1 724 287

經過 1位數排序後: 931 171 1 372 82 982 74 724 45 587 287

經過 10位數排序後: 1 724 931 45 171 372 74 82 982 587 287

經過100位數排序後: 1 45 74 82 171 287 372 587 724 931 982

每日一練4

員工表emp 員工編號eid,姓名ename,工作職位title,僱傭日期hiretime,工資salary,獎金bonus,部門depart 部門表dept 部門編號did,名稱dname,部門領導leader 員工資料 1001,張三 銷售 1999 12 1 3000.0,1100.0,102...

每日一練25

請描述 mysql 從安裝到配置的全部詳細過程 確保一台新電腦可以順利使用 mysql mysql安裝嚮導啟動,按 next 繼續 選擇安裝型別,有 typical 預設 complete 完全 custom 使用者自定義 三個選項,我們選擇 custom 有更多的選項,也方便熟悉安裝過程 選擇配置...

每日一練 13

談談你對ajax 的理解?概念 特點 作用 select 教師號,sum case when 星期號 1 and 是否有課 有 then 1 else 0 end as 星期一,sum case when 星期號 2 and 是否有課 有 then 1 else 0 end as 星期二,sum c...