python數據結構與算法(16)
阿新 • • 發佈:2018-12-04
nlogn 地理 ext mage alt 分析 ces img pre 時間復雜度
最優時間復雜度:O(nlogn) 最壞時間復雜度:O(n ) 穩定性:不穩定
從?開始快速排序平均需要花費O(n log n)時間的描述並不明顯。但是不難觀 察到的是分區運算,數組的元素都會在每次循環中?訪過?次,使?O(n)的 時間。在使?結合(concatenation)的版本中,這項運算也是O(n)。
在最好的情況,每次我們運??次分區,我們會把?個數列分為兩個?近相 等的?段。這個意思就是每次遞歸調?處理?半??的數列。因此,在到達 ??為?的數列前,我們只要作log n次嵌套的調?。這個意思就是調?樹的 深度是O(log n)。但是在同?層次結構的兩個程序調?中,不會處理到原來數 列的相同部分;因此,程序調?的每?層次結構總共全部僅需要O(n)的時間 (每個調?有某些共同的額外耗費,但是因為在每?層次結構僅僅只有O(n) 個調?,這些被歸納在O(n)系數中)。結果是這個算法僅需使?O(n log n)時 間。
快速排序演示
希爾排序
希爾排序(Shell Sort)是插?排序的?種。也稱縮?增量排序,是直接插?排 序算法的?種更?效的改進版本。希爾排序是?穩定排序算法。該?法因 DL.Shell於1959年提出?得名。 希爾排序是把記錄按下標的?定增量分 組,對每組使?直接插?排序算法排序;隨著增量逐漸減少,每組包含的關 鍵詞越來越多,當增量減?1時,整個?件恰被分成?組,算法便終?。
希爾排序過程
希爾排序的基本思想是:將數組列在?個表中並對列分別進?插?排序,重 復這過程,不過每次?更?的列(步?更?了,列數更少了)來進?。最後 整個表就只有?列了。將數組轉換?表是為了更好地理解這算法,算法本身 還是使?數組進?排序。
例如,假設有這樣?組數[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我們以步?為5開始進?排序,我們可以通過將這列表放在有5列的表 中來更好地描述算法,這樣他們就應該看起來是這樣(豎著的元素是步?組 成):
最優時間復雜度:O(nlogn) 最壞時間復雜度:O(n ) 穩定性:不穩定
從?開始快速排序平均需要花費O(n log n)時間的描述並不明顯。但是不難觀 察到的是分區運算,數組的元素都會在每次循環中?訪過?次,使?O(n)的 時間。在使?結合(concatenation)的版本中,這項運算也是O(n)。
在最好的情況,每次我們運??次分區,我們會把?個數列分為兩個?近相 等的?段。這個意思就是每次遞歸調?處理?半??的數列。因此,在到達 ??為?的數列前,我們只要作log n次嵌套的調?。這個意思就是調?樹的 深度是O(log n)。但是在同?層次結構的兩個程序調?中,不會處理到原來數 列的相同部分;因此,程序調?的每?層次結構總共全部僅需要O(n)的時間 (每個調?有某些共同的額外耗費,但是因為在每?層次結構僅僅只有O(n) 個調?,這些被歸納在O(n)系數中)。結果是這個算法僅需使?O(n log n)時 間。
希爾排序
希爾排序(Shell Sort)是插?排序的?種。也稱縮?增量排序,是直接插?排 序算法的?種更?效的改進版本。希爾排序是?穩定排序算法。該?法因 DL.Shell於1959年提出?得名。 希爾排序是把記錄按下標的?定增量分 組,對每組使?直接插?排序算法排序;隨著增量逐漸減少,每組包含的關 鍵詞越來越多,當增量減?1時,整個?件恰被分成?組,算法便終?。
希爾排序過程
希爾排序的基本思想是:將數組列在?個表中並對列分別進?插?排序,重 復這過程,不過每次?更?的列(步?更?了,列數更少了)來進?。最後 整個表就只有?列了。將數組轉換?表是為了更好地理解這算法,算法本身 還是使?數組進?排序。
13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10
然後我們對每列進?排序:
10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45
將上述四?數字,依序接在?起時我們得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。這時10已經移?正確位置了,然後再以3為步?進 ?排序:
10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45
排序之後變為:
10 14 13 25 23 33 27 25 59 39 65 73 45 94 82 94
最後以1步?進?排序(此時就是簡單的插?排序了)
希爾排序的分析
def shell_sort(alist): n = len(alist) # 初始步? gap = n / 2 while gap > 0: # 按步?進?插?排序 for i in range(gap, n): j = i # 插?排序 while j>=gap and alist[j-gap] > alist[j]: alist[j-gap], alist[j] = alist[j], alist[j-ga p] j -= gap # 得到新的步?
gap = gap / 2
alist = [54,26,93,17,77,31,44,55,20] shell_sort(alist) print(alist)
時間復雜度
最優時間復雜度:根據步?序列的不同?不同 最壞時間復雜度:O(n ) 穩定性:不穩定
希爾排序演示
python數據結構與算法(16)