溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用python實(shí)現(xiàn)希爾、計(jì)數(shù)、基數(shù)基礎(chǔ)排序的代碼

發(fā)布時(shí)間:2021-03-24 10:40:40 來源:億速云 閱讀:196 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下如何使用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ù)有序。

如何使用python實(shí)現(xiàn)希爾、計(jì)數(shù)、基數(shù)基礎(chǔ)排序的代碼

實(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ù)記錄到輔助空間后,通過對輔助空間內(nèi)數(shù)據(jù)的計(jì)算,即可確定每一個(gè)元素最終的位置。

  1. 根據(jù)待排序集合中最大元素和最小元素的差值范圍,申請額外空間;

  2. 遍歷待排序集合,將每一個(gè)元素出現(xiàn)的次數(shù)記錄到元素值對應(yīng)的額外空間內(nèi);

  3. 對額外空間內(nèi)數(shù)據(jù)進(jìn)行計(jì)算,得出每一個(gè)元素的正確位置;

  4. 將待排序集合每一個(gè)元素移動到計(jì)算得出的正確位置上。

如何使用python實(shí)現(xiàn)希爾、計(jì)數(shù)、基數(shù)基礎(chǔ)排序的代碼

實(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)定的排序。

對32,13,94,52,17,54,93進(jìn)行排序,是否可以看作多關(guān)鍵字排序?

如何使用python實(shí)現(xiàn)希爾、計(jì)數(shù)、基數(shù)基礎(chǔ)排序的代碼

實(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)定

看完了這篇文章,相信你對“如何使用python實(shí)現(xiàn)希爾、計(jì)數(shù)、基數(shù)基礎(chǔ)排序的代碼”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI