由Insert排序和Merge排序說起

2021-05-02 11:15:48 字數 1682 閱讀 5297

這是我第一次寫博,由於最近在看演算法方面的書,就從這個方面說起吧。

一般我們要分析乙個演算法,不可避免的要提到記號o,例如我們說乙個演算法的複雜度t(n) = o(n2).表示的是這個演算法在最壞的情況下,其執行的時間t(n)與輸入的長度(n)存在乙個漸進上界cn2(c是乙個正常數),用數學語言就是:

存在這乙個正常數c,正整數n0,使得對於所有的n>=n0,都有 t(n) <= cn2。

從這個式子我們可以看出,在分析乙個演算法複雜度的時候,我們只關心:

(1) n足夠大的情況。

(2) 只考慮隨著n的增大,執行時間增加的數量級(是n的幾次方),而忽略其係數(c)。

其實,在一般的演算法書中還存在這 兩個符號ώ和θ,t(n) = ώ(n2),表示最壞情況的下界,即:

存在這乙個正常數c,正整數n0,使得對於所有的n>=n0,都有 t(n) >= cn2。如果t(n) 即等於o(n2)又等於ώ(n2),我們說t(n) = θ

(n2)。

這個地球人都知道,最簡單的情況就是:

給定乙個整數陣列a[n],將其中的元素進行非降序排列,並輸出出來。

insert排序演算法的原理有點象我們打牌的時候的齊牌,所有的牌都覆蓋在桌上,一張一張的拿起,拿到第一張我們認為它最小,然後拿第二張,將它插到前面排好的序列(其實只有一張)中去,這樣前兩張排好了,同理,拿到第三張時,將其插到前面排好的序列中去,依此類推,直到將所有的牌都排好了為止。

**如下:

那麼我們如何分析insert演算法的複雜度呢,上面**的操作主要時比較(==,>,<,>=,<=)和交換(賦值=)組成。假定一次比較操作的時間相當,為a,一次賦值的時間也相當,為 b,那麼上面演算法的最壞情況的時間為:

t(n) = (a+2b) *(n-1) + (a+b)*(1+2+3+...+n-1) = (a+2b) *(n-1) + (a+b)* (n-1)*(n-2) /2 = o(n2)

merge演算法是一種分治思想,將n個元素的排序分成n/2個元素的子問題,然後將排好的子串行進行合併。

**如下:

根據上面的**,我們可以很容易的知道函式merge的複雜度為θ

(n),那麼mergesort需要的時間為:

t(n)= 2t(n/2)+ θ

(n).

那麼根據上式我們怎麼得到mergesort的複雜度呢?

主定理(不知道為什麼叫做主定理)就是為了解決上述問題的。描述如下:

設 a >=1和 b >=1 為常數,f(n)為一函式,t(n) =at(n/b) + f(n),如果

n/b 不為整數的話,可為比n/b小的最大整數,或者比n/b大的最小整數,則有:

1. 若對某常數 e>0, 有f(n) = o(nlogba-e). 則 t(n) = θ

(nlogba).

2. 若f(n) = θ

(nlogba),則 t(n) = θ

(nlogbalgn).

3. 若對某常數 e>0,有f(n) = ώ(nlogba+e),  且對常量c<1與所有足夠大的n,有af(n/b) <=cf(n),則:

t(n) = θ

(f(n)).

根據如上的定理,t(n)=2t(n/2+θ

(n)屬於第二種情況,即有t(n) = θ(nlogbalgn) = θ(nlgn) = o(nlgn)。

從上面的分析來看,在時間上merge演算法要由於insert演算法。

歸併排序Merge

歸併排序 歸併排序是一種基於分治法的一種排序方法。它將要排序的序列分成兩個長度相等的子串行,為每乙個子串行進行排序,然後再將子串行合併成乙個有序的序列。歸併排序 時間複雜度 o n logn 空間複雜度 o n 穩定性 穩定排序 第乙個區間 beg,mid 第二個區間 mid,end void me...

歸併排序 完成merge方法

在工程問題中,當對大量資料進行排序的時候,資料往往是放在陣列中的。這時進行排序需要一些騰挪的技巧。一般是使用乙個臨時的陣列空間儲存中間結果,排好序以後,再拷貝回原來的陣列。package cn.itcast.sort public class mergesort data中的資料,low,mid m...

git rebase和merge 區別和應用場景

第一篇 git rebase merge 的區別和應用場景檢視 對於兩個分支而言,rebase和merge沒有區別,但是rebase更乾淨,因為log hisitory是線性的,但commit不一定按日期先後排,而是local commit總在後面,merge之後history變得比較複雜,但是co...