1. 程式人生 > >python數據結構與算法(16)

python數據結構與算法(16)

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列的表 中來更好地描述算法,這樣他們就應該看起來是這樣(豎著的元素是步?組 成):

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)