排序演算法python實現

2021-05-25 08:28:28 字數 1793 閱讀 9498

先列出一些演算法複雜度的識別符號號的意思, 最常用的是o,表示演算法的上屆,如 2n2 = o(n2 ), 而且有可能是漸進緊確的, 意思是g(n)乘上乙個常數係數是可以等於f(n)的,就是所謂的a<=b。而o的區別就是非漸進緊確的,如2n = o(n2 ), o(n2 )確實可以作為2n的上屆, 不過比較大, 就是所謂的a其他符號表示了下屆,和非漸進緊確的下屆, a>=b, a>b

還有既是上屆也是下屆, 就是a=b

bubble sort

氣泡排序效率是最低的, 對於list中任意一點, 都必須遍歷其後所有元素以找到最小元素, 這個耗費是n

所以對於完整的冒泡演算法, 對list中n個點, 演算法複雜度就是n2

insert sort

對於插入的任乙個元素, 最差情況是需要遍歷它之前的所有元素, 才能找到插入位置. 但這個是最差情況, 一般不需要.

所以他的複雜度同樣是n2 , 但對於普通的排序, 效率要高於冒泡

merge sort

這個演算法是基於二分法的遞迴演算法, 把二分遞迴的過程圖形化, 會形成乙個遞迴樹(對分析表示分治演算法的遞迴式的複雜度時,遞迴樹方法好用形象). 樹高為logn, 對於樹的每一層進行並歸操作, 可以看出每層並歸的耗費最大是n, 所以演算法複雜度就是nlogn.merge sort的缺點就是, 它不是inplace的, 需要耗費和輸入同樣大小的資料空間.

heap sort

堆排序首先是建堆, 建堆就是對所有非葉子節點進行堆化操作, 堆化的最大耗費是logn, 所以建堆的最大耗費是nlogn, 但是其實大部分的節點的高都遠遠沒有logn, 這個可以計算出實際的最大耗費只有n.

最後排序的耗費n-1次堆化操作, 所以整個的複雜度為nlogn.

堆排序複雜度達到nlogn, 而且是inplace演算法.

quick sort

快排在最差的情況下,即對於已經排好序的序列, 每次劃分都是0和n-1, 這樣的演算法複雜度為n2 .這種情況下如果表示成遞迴樹, 樹高為n, 每層partition的耗費是n,所以複雜度為n*n

而在最好情況下就是, 序列為對稱的, 每次為折半劃分, 這個情況和並歸排序一樣, 耗費為nlogn

而在平均情況下, 可以證明是接近最好情況的, 即複雜度為nlogn,原因是任何一種按常數比例進行的劃分都會產生深度為lgn的遞迴樹

其他排序問題

對於普通的排序演算法, 即比較排序演算法, 複雜度的下限為nlogn, 不可能比這個更少

對於這個的理解是, 比較排序可以被抽象為決策樹, 對於n個元素可能的排列為n!個, 所以樹的葉子節點有n!個, 對於乙個高h的樹, 葉子節點最多有2h 個, 所以可以算出h的下限為nlogn

而對於比較排序而言, 任意兩個元素的順序都要通過一次比較來完成, 所以下限為需要兩兩比較的次數

如果要突破這個下限, 就必須基於某種假設, 而不可能是通用的比較演算法.

比如計數排序, 假設輸入由乙個小範圍內(小於k)的整數構成, 那排序方法很簡單, 建立乙個長度為k的陣列a, 遍歷輸入, 並把輸入i放入相應的a[i]中. 排序只要o(n)

如果是桶排序, 假設輸入為均勻分布[0,1), 由乙個隨機過程產生. 把[0,1)區域均勻劃分為n個子區域, 稱為桶, 然後把輸入分布到各個桶中. 用於輸入是均勻分布的, 每個桶中的輸入一定很少, 那麼先在桶內排序, 然後把各個桶中的元素列出來即可.

python排序演算法實現

coding utf 8 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大 公升序 就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步...

Python實現排序演算法

一.氣泡排序 該排序重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序 如從大到小 首字母從z到a 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。穩定性 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交...

Python實現排序演算法

一.基數排序 最高位優先法,簡稱msd法 先按k1排序分組,同一組中記錄,關鍵碼k1相等,再對各組按k2排序分成子組,之後,對後面的關鍵碼繼續這樣的排序分組,直到按最次位關鍵碼kd對各子組排序後。再將各組連線起來,便得到乙個有序序列。最低位優先法,簡稱lsd法 先從kd開始排序,再對kd 1進行排序...