使用python實(shí)現(xiàn)希爾、計(jì)數(shù)、基數(shù)基礎(chǔ)排序的代碼
希爾排序
希爾排序是一個(gè)叫希爾的數(shù)學(xué)家提出的一種優(yōu)化版本的插入排序。
首先取一個(gè)整數(shù)d1=n//2,將元素分為d1個(gè)組,每組相鄰元素之間的距離為d1,在各組內(nèi)進(jìn)行直接插入排序。
取第二個(gè)整數(shù)d2=d1//2,重復(fù)上述分組排序過程,直到di=1,即所有元素在同一組內(nèi)進(jìn)行直接插入排序。
希爾排序是使整體數(shù)據(jù)越來越接近有序;最后一趟排序使得所有數(shù)據(jù)有序。
實(shí)現(xiàn)
# 希爾排序 def shell_sort(li): n = len(li) gap = n // 2 while gap > 0: for i in range(gap, n): temp = li[i] j = i - gap while j >= 0 and li[j] > temp: li[j + gap] = li[j] j -= gap li[j + gap] = temp gap //= 2
算法分析
- 時(shí)間復(fù)雜度:O(n1.3)
- 最好時(shí)間復(fù)雜度:O(n)
- 最壞時(shí)間復(fù)雜度:O(n2)
- 空間復(fù)雜度:O(1)
- 穩(wěn)定性:不穩(wěn)定
計(jì)數(shù)排序
計(jì)數(shù)排序是一種非比較性質(zhì)的排序算法,元素從未排序狀態(tài)變?yōu)橐雅判驙顟B(tài)的過程,是由額外空間的輔助和元素本身的值決定的。
計(jì)數(shù)排序過程中不存在元素之間的比較和交換操作,根據(jù)元素本身的值,將每個(gè)元素出現(xiàn)的次數(shù)記錄到輔助空間后,通過對(duì)輔助空間內(nèi)數(shù)據(jù)的計(jì)算,即可確定每一個(gè)元素最終的位置。
- 根據(jù)待排序集合中最大元素和最小元素的差值范圍,申請(qǐng)額外空間;
- 遍歷待排序集合,將每一個(gè)元素出現(xiàn)的次數(shù)記錄到元素值對(duì)應(yīng)的額外空間內(nèi);
- 對(duì)額外空間內(nèi)數(shù)據(jù)進(jìn)行計(jì)算,得出每一個(gè)元素的正確位置;
- 將待排序集合每一個(gè)元素移動(dòng)到計(jì)算得出的正確位置上。
實(shí)現(xiàn)
def count_sort(li, max_num=100): count = [0 for _ in range(max_num + 1)] for val in li: count[val] += 1 li.clear() # 表示i這個(gè)數(shù)出現(xiàn)了v次 for i, v in enumerate(count): for _ in range(v): li.append(i)
算法分析
假定原始數(shù)列的規(guī)模是N
最大值和最小值的差是M
計(jì)數(shù)排序的時(shí)間復(fù)雜度是O(N+M)
如果不考慮結(jié)果數(shù)組,只考慮中間數(shù)組大小的話,空間復(fù)雜度是O(M)
基數(shù)排序
基數(shù)排序(英語:Radix sort)是一種非比較型整數(shù)排序算法,其原理是將整數(shù)按位數(shù)切割成不同的數(shù)字,然后按每個(gè)位數(shù)分別比較。
由于整數(shù)也可以表達(dá)字符串(比如名字或日期)和特定格式的浮點(diǎn)數(shù),所以基數(shù)排序也不是只能使用于整數(shù)。
多關(guān)鍵字排序:現(xiàn)在有一個(gè)員工,要求按照薪資排序,年齡相同的員工按照按照年齡排序。
先按照年齡進(jìn)行排序,再按照薪資進(jìn)行穩(wěn)定的排序。
對(duì)32,13,94,52,17,54,93進(jìn)行排序,是否可以看作多關(guān)鍵字排序?
實(shí)現(xiàn)
# 基數(shù)排序 def radix_sort(li): max_num = max(li) i = 0 while (10 ** i <= max_num): buckets = [[] for _ in range(10)] for val in li: # i=0 個(gè)位 i=1 十位 i=2 百位 .. digit = val // (10**i) % 10 buckets[digit].append(val) li.clear() for bucket in buckets: for val in bucket: li.append(val) i += 1
算法分析
- 時(shí)間復(fù)雜度:O(kn)
- 最好時(shí)間復(fù)雜度:O(kn)
- 最壞時(shí)間復(fù)雜度:O(kn)
- 空間復(fù)雜度:O(n+k)
- 穩(wěn)定性:穩(wěn)定
總結(jié)
以上所述是小編給大家介紹的使用python實(shí)現(xiàn)希爾、計(jì)數(shù)、基數(shù)基礎(chǔ)排序,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
flask實(shí)現(xiàn)python方法轉(zhuǎn)換服務(wù)的方法
flask是一個(gè)web框架,可以通過提供的裝飾器@server.route()將普通函數(shù)轉(zhuǎn)換為服務(wù),這篇文章主要介紹了flask實(shí)現(xiàn)python方法轉(zhuǎn)換服務(wù),需要的朋友可以參考下2022-05-05使用python實(shí)現(xiàn)mqtt的發(fā)布和訂閱
這篇文章主要介紹了使用python實(shí)現(xiàn)mqtt的發(fā)布和訂閱,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05Python實(shí)現(xiàn)自動(dòng)化處理PDF文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Python完成簡單的PDF文件處理操作,如PDF文件的批量合并、拆分、加密以及添加水印等,需要的可以參考一下2022-09-09在Python 2.7即將停止支持時(shí),我們?yōu)槟銕砹艘环輕ython 3.x遷移指南
這篇文章主要介紹了在Python 2.7即將停止支持時(shí)我們?yōu)槟銣?zhǔn)備了一份python 3.x遷移指南的相關(guān)資料,需要的朋友可以參考下2018-01-01Python函數(shù)的默認(rèn)參數(shù)設(shè)計(jì)示例詳解
這篇文章主要給大家介紹了關(guān)于Python函數(shù)的默認(rèn)參數(shù)設(shè)計(jì)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12三步實(shí)現(xiàn)Django Paginator分頁的方法
這篇文章主要介紹了三步實(shí)現(xiàn)Django Paginator分頁的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06