1. 程式人生 > >【路飛學城Day170】演算法小結

【路飛學城Day170】演算法小結

Evernote Export

演算法的思想是能省則省,記憶體能少則少,時間執行能少儘量少 堆排序的時間複雜度O(nlogn) 堆排序的內建模組heapq 常用函式 heapify(x) heappush(heap, item) heappop(heap) topkey問題 現在有n個數,設計演算法得到前k大的數(k>n)
解決思路:      排序後切片  O(nlogn)
    排序lowB三人組 O(kn)
    堆排序 O(nlogk)
堆排序解決思路     取列表前k個元素建立一個小根堆,堆頂就是目前第k大的數
    一次向後遍歷原列表,對於列表中的元素,如果小於堆頂,則忽略該元素,如果大於堆頂,則將堆頂更換為該元素,並且對堆進行一次調整

歸併排序 假設現在的列表分兩段有序,如何將其合成為一個有序列表 歸併排序 分解:將列表越分越小,直至分成一個元素 終止條件:一個元素是有序的 合併:將兩個有序列表歸併,列表越來越大
三種排序演算法小結 時間複雜度都是O(logn) 一般情況下,就執行時間而言:快速排序<歸併排序<堆排序 三種排序演算法的缺點: 快速排序:極端情況下排序效率低 歸併排序:需要額外的記憶體開銷
堆排序:在快的排序演算法中相對較慢  
排序方法 時間複雜度 空間複雜度 穩定性 程式碼複雜度
最壞情況 平均情況 最好情況
氣泡排序 O(n^2) O(n^2)
O(n) O(1) 穩定 簡單
直接選擇排序 O(n^2)
O(n^2)
O(n^2)
O(1)
不穩定 簡單
直接插入排序 O(n^2)
O(n^2)
O(nlogn)
O(1)
穩定
簡單
快速排序 O(n^2)
O(nlogn)
O(nlogn)
平均情況O(logn); 最壞情況O(n) 不穩定
較複雜
堆排序 O(nlogn) O(nlogn)
O(nlogn)
O(1) 不穩定
複雜
歸併排序 O(nlogn)
O(nlogn)
O(nlogn)
O(n) 穩定
較複雜