国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python數(shù)據(jù)結(jié)構(gòu)與算法之常見的分配排序法示例【桶排序與基數(shù)排

2020-02-16 11:07:49
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Python數(shù)據(jù)結(jié)構(gòu)與算法之常見的分配排序法。分享給大家供大家參考,具體如下:

箱排序(桶排序)

箱排序是根據(jù)關(guān)鍵字的取值范圍1~m,預(yù)先建立m個(gè)箱子,箱排序要求關(guān)鍵字類型為有限類型,可能會(huì)有無限個(gè)箱子,實(shí)用價(jià)值不大,一般用于基數(shù)排序的中間過程。

桶排序是箱排序的實(shí)用化變種,其對(duì)數(shù)據(jù)集的范圍,如[0,1) 進(jìn)行劃分為n個(gè)大小相同的子區(qū)間,每一個(gè)子區(qū)間為一個(gè)桶,然后將n非記錄分配到各桶中。因?yàn)殛P(guān)鍵字序列是均勻分布在[0,1)上的,所以一般不會(huì)有很多記錄落入同一個(gè)桶中。

以下的桶排序方法采用字典實(shí)現(xiàn),所以對(duì)于整數(shù)類型,并不需要建立多余空間

def BuckSort(A): bucks = dict()  # 桶 for i in A:  bucks.setdefault(i,[]) # 每個(gè)桶默認(rèn)為空列表  bucks[i].append(i)  # 往對(duì)應(yīng)的桶中添加元素 A_sort = [] for i in range(min(A), max(A)+1):  if i in bucks:     # 檢查是否存在對(duì)應(yīng)數(shù)字的桶   A_sort.extend(bucks[i])  # 合并桶中數(shù)據(jù) return A_sort

基數(shù)排序

# 基數(shù)排序# 輸入:待排序數(shù)組s, keysize關(guān)鍵字位數(shù), 亦即裝箱次數(shù), radix基數(shù)def RadixSort(s, keysize=4, radix=10): # 按關(guān)鍵字的第k分量進(jìn)行分配 k = 4,3,2,1 def distribute(s,k):  box = {r:[] for r in range(radix)}  # 分配用的空箱子  for item in s:   # 依次掃描s[],將其裝箱   t = item   t /= 10**(k-1)   t %= 10    # 去關(guān)鍵字第k位   box[t].append(item)  return box # 按分配結(jié)果重新排列數(shù)據(jù) def collect(s,box):  a = 0  for i in range(radix):   s[a:a + len(box[i])] = box[i][:] # 將箱子中元素的合并,覆蓋到原來的數(shù)組中   a += len(box[i])     # 增加偏移值 # 核心算法 for k in range(1,keysize+1):  box = distribute(s,k)   # 按基數(shù)分配  collect(s,box)     # 按分配結(jié)果拼合

以下摘自:《數(shù)據(jù)結(jié)構(gòu)與算法——理論與實(shí)踐》

基數(shù)排序可以拓展為按多關(guān)鍵字排序,如對(duì)撲克牌按花色、按點(diǎn)數(shù)排序。
一般地,設(shè)線性表有那個(gè)待排序元素,每個(gè)元素包含d個(gè)關(guān)鍵字{k1,k2,...,kd},則該線性表對(duì)關(guān)鍵字有序指,對(duì)于線性表中任意兩個(gè)元素r[i]和r[j],1<=i<=j<=n,都滿足下列有序關(guān)系:
    {k1i,k2i,...,kdi} < {k1j,k2j,...,kdj}
其中k1稱為最主位關(guān)鍵字,kd稱為最次位關(guān)鍵字
其排序方法分兩種:最高位優(yōu)先MSD(most significant digit frist)與最低位優(yōu)先LSD(least significant digit first)

MSD: 先按k1排序分組,同一組的個(gè)元素,若關(guān)鍵字k1相等,再對(duì)各組按k2排序分成子組,依次類推,直到最次位kd對(duì)各子組排序后,再將各組鏈接起來。

LSD: 與MSD相反,先按kd排序,再對(duì)kd-1排序,依次類推。

PS:這里再為大家推薦一款關(guān)于排序的演示工具供大家參考:

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 康马县| 湘西| 图木舒克市| 宁化县| 东莞市| 阿克苏市| 西藏| 广德县| 慈利县| 海盐县| 仁布县| 贞丰县| 威海市| 新泰市| 巴塘县| 修水县| 濮阳市| 义乌市| 云霄县| 阿坝县| 三门峡市| 怀宁县| 繁昌县| 上饶市| 沾益县| 乌兰浩特市| 津南区| 鸡西市| 云龙县| 南部县| 基隆市| 视频| 肇东市| 祁门县| 防城港市| 灵丘县| 军事| 潜江市| 陇西县| 晋江市| 天门市|