使用python實現希爾 計數 基數排序

2021-10-01 17:23:07 字數 1968 閱讀 4440

希爾排序是乙個叫希爾的數學家提出的一種優化版本的插入排序。

首先取乙個整數d1=n//2,將元素分為d1個組,每組相鄰元素之間的距離為d1,在各組內進行直接插入排序。

取第二個整數d2=d1//2,重複上述分組排序過程,直到di=1,即所有元素在同一組內進行直接插入排序。

希爾排序是使整體資料越來越接近有序;最後一趟排序使得所有資料有序。

#

希爾排序

defshell_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

計數排序是一種非比較性質的排序演算法,元素從未排序狀態變為已排序狀態的過程,是由額外空間的輔助和元素本身的值決定的。

計數排序過程中不存在元素之間的比較和交換操作,根據元素本身的值,將每個元素出現的次數記錄到輔助空間後,通過對輔助空間內資料的計算,即可確定每乙個元素最終的位置。

根據待排序集合中最大元素和最小元素的差值範圍,申請額外空間;

遍歷待排序集合,將每乙個元素出現的次數記錄到元素值對應的額外空間內;

對額外空間內資料進行計算,得出每乙個元素的正確位置;

將待排序集合每乙個元素移動到計算得出的正確位置上。

def count_sort(li, max_num=100):

count = [0 for _ in range(max_num + 1)]

for val in

li: count[val] += 1li.clear()

#表示i這個數出現了v次

for i, v in

enumerate(count):

for _ in

range(v):

假定原始數列的規模是n

最大值和最小值的差是m

計數排序的時間複雜度是o(n+m)

如果不考慮結果陣列,只考慮中間陣列大小的話,空間複雜度是o(m)

基數排序(英語:radix sort)是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。

由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。

多關鍵字排序:現在有乙個員工,要求按照薪資排序,年齡相同的員工按照按照年齡排序。

先按照年齡進行排序,再按照薪資進行穩定的排序。

對32,13,94,52,17,54,93進行排序,是否可以看作多關鍵字排序?

#

基數排序

defradix_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 百位 ..

li.clear()

for bucket in

buckets:

for val in

bucket:

i += 1

~>.<~

希爾排序 Python實現

基本思想 希爾排序 def shell insert sort a,dk n len a for k in range dk 間距取dk,一共可以組成dk個子序列 for i in range k dk,n,dk 第0,dk,2dk.為一組 temp a i 記錄待插入的元素值 j i dk 子串行...

希爾排序Python實現

python 實現 希爾排序,希爾排序其實 就是 插入排序的改進版吧,希爾排序的步長選擇都是從d len 2開始,每次再減半,直到最後為1,當變為1的時候 可以認為就是簡單的插入排序。這種縮小步長的好處,非常簡單,彌補了插入排序的缺點,盡可能減少數字的移動次數。希爾思想是這樣 區域性看起來有序,然後...

希爾排序 python實現

希爾排序的基本思想是 將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列 步長更長了,列數更少了 來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。def shell sort alist 希爾排序 param alist ...