@本文來源於公衆號:csdn2299,喜歡可以關注公衆號 程序員學府
希爾排序是一個叫希爾的數學家提出的一種優化版本的插入排序。這篇文章主要介紹了使用python實現希爾、計數、基數基礎排序,需要的朋友可以參考下
希爾排序
希爾排序是一個叫希爾的數學家提出的一種優化版本的插入排序。
首先取一個整數d1=n//2,將元素分爲d1個組,每組相鄰元素之間的距離爲d1,在各組內進行直接插入排序。
取第二個整數d2=d1//2,重複上述分組排序過程,直到di=1,即所有元素在同一組內進行直接插入排序。
希爾排序是使整體數據越來越接近有序;最後一趟排序使得所有數據有序。
實現
# 希爾排序
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
算法分析
時間複雜度:O(n1.3)
最好時間複雜度:O(n)
最壞時間複雜度:O(n2)
空間複雜度:O(1)
穩定性:不穩定
計數排序
計數排序是一種非比較性質的排序算法,元素從未排序狀態變爲已排序狀態的過程,是由額外空間的輔助和元素本身的值決定的。
計數排序過程中不存在元素之間的比較和交換操作,根據元素本身的值,將每個元素出現的次數記錄到輔助空間後,通過對輔助空間內數據的計算,即可確定每一個元素最終的位置。
根據待排序集合中最大元素和最小元素的差值範圍,申請額外空間;
遍歷待排序集合,將每一個元素出現的次數記錄到元素值對應的額外空間內;
對額外空間內數據進行計算,得出每一個元素的正確位置;
將待排序集合每一個元素移動到計算得出的正確位置上。
實現
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這個數出現了v次
for i, v in enumerate(count):
for _ in range(v):
li.append(i)
算法分析
假定原始數列的規模是N
最大值和最小值的差是M
計數排序的時間複雜度是O(N+M)
如果不考慮結果數組,只考慮中間數組大小的話,空間複雜度是O(M)
基數排序
基數排序(英語:Radix sort)是一種非比較型整數排序算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。
由於整數也可以表達字符串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是隻能使用於整數。
多關鍵字排序:現在有一個員工,要求按照薪資排序,年齡相同的員工按照按照年齡排序。
先按照年齡進行排序,再按照薪資進行穩定的排序。
對32,13,94,52,17,54,93進行排序,是否可以看作多關鍵字排序?
實現
# 基數排序
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 個位 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
算法分析
時間複雜度:O(kn)
最好時間複雜度:O(kn)
最壞時間複雜度:O(kn)
空間複雜度:O(n+k)
穩定性:穩定
非常感謝你的閱讀
大學的時候選擇了自學python,工作了發現吃了計算機基礎不好的虧,學歷不行這是
沒辦法的事,只能後天彌補,於是在編碼之外開啓了自己的逆襲之路,不斷的學習python核心知識,深入的研習計算機基礎知識,整理好了,如果你也不甘平庸,那就與我一起在編碼之外,不斷成長吧!
其實這裏不僅有技術,更有那些技術之外的東西,比如,如何做一個精緻的程序員,而不是“屌絲”,程序員本身就是高貴的一種存在啊,難道不是嗎?[點擊加入]想做你自己想成爲高尚人,加油!