1. 程式人生 > 程式設計 >使用python實現希爾、計數、基數基礎排序的程式碼

使用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)
  • 穩定性:不穩定

計數排序

計數排序是一種非比較性質的排序演算法,元素從未排序狀態變為已排序狀態的過程,是由額外空間的輔助和元素本身的值決定的。
計數排序過程中不存在元素之間的比較和交換操作,根據元素本身的值,將每個元素出現的次數記錄到輔助空間後,通過對輔助空間內資料的計算,即可確定每一個元素最終的位置。

  1. 根據待排序集合中最大元素和最小元素的差值範圍,申請額外空間;
  2. 遍歷待排序集合,將每一個元素出現的次數記錄到元素值對應的額外空間內;
  3. 對額外空間內資料進行計算,得出每一個元素的正確位置;
  4. 將待排序集合每一個元素移動到計算得出的正確位置上。

實現

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實現希爾、計數、基數基礎排序,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!