常見排序演算法和搜尋演算法 時間和空間複雜度

2021-10-06 23:17:59 字數 1649 閱讀 7634

排序方法        平均情況        最好情況        最壞情況        輔助空間        穩定性

氣泡排序         o(n^2)           o(n)              o(n^2)            o(1)                穩定

選擇排序         o(n^2)          o(n^2)            o(n^2)            o(1)              不穩定

插入排序         o(n^2)           o(n)              o(n^2)            o(1)                穩定

希爾排序o(n*log(n))~o(n^2) o(n^1.3)       o(n^2)            o(1)              不穩定

堆排序          o(n*log(n))     o(n*log(n))    o(n*log(n))       o(1)              不穩定

歸併排序       o(n*log(n))     o(n*log(n))    o(n*log(n))       o(n)                穩定

快速排序       o(n*log(n))     o(n*log(n))      o(n^2)            o(1)              不穩定

氣泡排序經過優化以後,最好時間複雜度可以達到o(n)。設定乙個標誌位,如果有一趟比較中沒有發生任何交換,可提前結束,因此在正序情況下,時間複雜度為o(n)。選擇排序在最壞和最好情況下,都必須在剩餘的序列中選擇最小(大)的數,與已排好序的序列後乙個位置元素做交換,依次最好和最壞時間複雜度均為o(n^2)。插入排序是在把已排好序的序列的後乙個元素插入到前面已排好序(需要選擇合適的位置)的序列中,在正序情況下時間複雜度為o(n)。堆是完全二叉樹,因此樹的深度一定是log(n)+1,最好和最壞時間複雜度均為o(n*log(n))。歸併排序是將大陣列分為兩個小陣列,依次遞迴,相當於二叉樹,深度為log(n)+1,因此最好和最壞時間複雜度都是o(n*log(n))。快速排序在正序或逆序情況下,每次劃分只得到比上一次劃分少乙個記錄的子串行,用遞迴樹畫出來,是一棵斜樹,此時需要n-1次遞迴,且第i次劃分要經過n-i次關鍵字比較才能找到第i個記錄,因此時間複雜度是\sum_^(n-i)=n(n-1)/2,即o(n^2)。

這是從大神給的**上找到的演算法的時間複雜度趨勢和各個常用結構的複雜度截圖。

演算法的時間複雜度,用來度量演算法的執行時間,記作: t(n) = o(f(n))。它表示隨著 輸入大小n 的增大,演算法執行需要的時間的增長速度可以用 f(n) 來描述。

常用查詢演算法的時間複雜度和空間複雜度

二叉樹的查詢 o(n) 

js實現排序和搜尋演算法

我們已經知道有一些常見的排序演算法,如氣泡排序,選擇排序,插入排序,歸併排序,快速排序和堆排序。下面我們逐個地分析並編寫相關 首先在排序之前,我們需要先建立乙個陣列來表示待排序和搜尋的資料結構以及陣列操作中最常見的交換位置函式swap。如下 function arraylist this.tostr...

演算法 排序演算法 搜尋演算法

排序演算法 function arraylist this.tostring function item 冒泡 this.bubblesort function function swap arr,index1,index2 改進冒泡,減少內迴圈不必要的比較次數,每一輪最後兩個數下一次沒必要再比較 ...

搜尋演算法(DFS和BFS)

題目 有n件物品,每件物品的重量為w i 價值為c i 現在需要選出若干物品放入乙個容器為v的揹包中,使得在選入揹包的物品重量和不超過容量v的前提下,讓揹包中物品的價值之和最大,求最大價值。1 n 20 解題 如下 includeconst int maxn 30 int n,v,maxvalue ...