在數(shù)據(jù)排序的算法中,不同數(shù)據(jù)規(guī)模應(yīng)當(dāng)使用合適的排序算法才能達(dá)到最好的效果,如小規(guī)模的數(shù)據(jù)排序,可以使用冒泡排序、插入排序,選擇排序,他們的時(shí)間復(fù)雜度都為O(n2),大規(guī)模的數(shù)據(jù)排序就可以使用歸并排序和快速排序,時(shí)間復(fù)雜度為O(nlogn)。今天我們就來(lái)看一下歸并排序和快速排序。
創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供云城企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為云城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。正文 歸并排序的原理 核心思想(分治思想):排序數(shù)組,將數(shù)組從中間分成前后兩部分,對(duì)前后兩部分分別排序,然后合在一起,這個(gè)數(shù)組就是有序的。
歸并排序的性能分析1.歸并排序是一個(gè)穩(wěn)定的排序算法:在合并的過(guò)程中,如果A[p...q]和A[q+1...r]之間中有相同的元素,先把A[p...q]中的元素放入tmp數(shù)組。這樣就保證了值相同的元素,在合并前后的先后順序不變。
2.歸并排序的時(shí)間復(fù)雜度是O(nlogn):在解決遞歸問(wèn)題時(shí),我們得出一個(gè)結(jié)論:遞歸問(wèn)題可以寫(xiě)成遞推公式,遞歸代碼的時(shí)間復(fù)雜度也可以寫(xiě)成遞推公式
我們假設(shè)對(duì)n個(gè)元素進(jìn)行歸并排序需要的時(shí)間是T(n),那分解成兩個(gè)子數(shù)組排序的時(shí)間都是T(n/2),套用結(jié)論可以得到歸并排序的時(shí)間復(fù)雜度的計(jì)算公式就是:
T(1) = C; n=1 時(shí),只需要常量級(jí)的執(zhí)行時(shí)間,所以表示為 C。 T(n) = 2*T(n/2) + n; n>1
再次將這個(gè)公式分解:
T(n) = 2*T(n/2) + n = 2*(2*T(n/4) + n/2) + n = 4*T(n/4) + 2*n = 4*(2*T(n/8) + n/4) + 2*n = 8*T(n/8) + 3*n = 8*(2*T(n/16) + n/8) + 3*n = 16*T(n/16) + 4*n ...... = 2^k * T(n/2^k) + k * n ......
我們可以得到T(n)=2^kT(n/2^k)+kn.當(dāng)T(n/2^k)=T(1)時(shí),也就是n/2^k=1,我們將得到k=log2n,問(wèn)你將k帶入公式得到
T(n)=Cn+nlog2n
用大O標(biāo)記法來(lái)表示為T(mén)(n) 就等于 O(nlogn)
而且時(shí)間復(fù)雜度是非常穩(wěn)定的:最好情況,最壞情況,還是平均情況,時(shí)間復(fù)雜度都是O(nlogn)
3、歸并排序的空間復(fù)雜度為O(n)
歸并排序的致命缺點(diǎn):歸并排序不是原地排序算法(在合并兩個(gè)有序數(shù)組時(shí),需要借助額外的存儲(chǔ)空間)
遞歸代碼的空間復(fù)雜度并不能像時(shí)間復(fù)雜度那樣累加、盡管每次合并操作都需要申請(qǐng)額外的內(nèi)存空間,但在合并完成之后、臨時(shí)開(kāi)辟的內(nèi)存空間就被釋放掉了、臨時(shí)內(nèi)存空間大也不會(huì)超過(guò) n 個(gè)數(shù)據(jù)的大小
快速排序的原理如果要排序數(shù)組中下標(biāo)從p到r之間的一組數(shù)據(jù),我們選擇p到r之間的任意一個(gè)數(shù)據(jù)作為pivot(分區(qū)點(diǎn)),遍歷數(shù)據(jù),見(jiàn)小于pivot的放在右邊,大于pivot放在左邊。這樣數(shù)組就分成了三部分,用遞歸排序下標(biāo)從 p 到 q-1 之間的數(shù)據(jù)和下標(biāo)從 q+1.到r之間的數(shù)據(jù),直到區(qū)間縮小為1,說(shuō)明數(shù)據(jù)都有序
快速排序的時(shí)間復(fù)雜度為O(1):在排序過(guò)程中,假如遇到需要移動(dòng)數(shù)據(jù)的,我們可以之間用交換的思想
(圖片來(lái)源于網(wǎng)絡(luò),侵刪)
空間復(fù)雜度為O(1)
快速排序和歸并排序的區(qū)別?看圖:
(圖片來(lái)源于網(wǎng)絡(luò),侵刪)
處理過(guò)程的差異:
遞歸排序:先處理子問(wèn)題再合并
快速排序:先分區(qū),再處理子問(wèn)題
歸并排序雖然穩(wěn)定,是時(shí)間復(fù)雜度為O(nlogn)的排序算法,但是它不是原地排序算法,合并過(guò)程中需要額外的空間。
快速排序的性能分析遞歸代碼的時(shí)間復(fù)雜度,如果每次分區(qū)操作,都能正好將數(shù)組分為兩個(gè)大小相等的兩個(gè)小區(qū)間,那快速排序的遞推公式和遞推排序是相同的,所以,快排的時(shí)間復(fù)雜度為O(nlogn)
但是,每次都分得那么均勻是非常難實(shí)現(xiàn)的。
T(n)在大部分情況下的時(shí)間復(fù)雜度都可以做到O(nlogn),只有在極端情況下才會(huì)退化為O(n2).
后記遞歸和快排都是分治的思想,代碼都通過(guò)遞歸來(lái)實(shí)現(xiàn),過(guò)程非常相似。歸并排序時(shí)間復(fù)雜度都非常穩(wěn)定為O(nlogn),但是每次合并的時(shí)候都需要額外的空間,空間復(fù)雜度非常高為是O(n),快速排序算法雖然最壞時(shí)間復(fù)雜度為O(n2),但是平均時(shí)間復(fù)雜度為O(nlogn),最壞的情況我們也可以避免。
相關(guān)文章數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記之寫(xiě)鏈表代碼的正確姿勢(shì)(下)
數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記之 提高讀取性能的鏈表(上)
數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記之 從0編號(hào)的數(shù)組
數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記之后進(jìn)先出的“桶”
數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記之先進(jìn)先出的隊(duì)列
數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記之高效、簡(jiǎn)潔的編碼技巧“遞歸”
數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)筆記之如何分析一個(gè)排序算法?以上內(nèi)容為個(gè)人的學(xué)習(xí)筆記,僅作為學(xué)習(xí)交流之用。
歡迎大家關(guān)注公眾號(hào),不定時(shí)干貨,只做有價(jià)值的輸出
作者:Dawnzhang
出處:https://www.cnblogs.com/clwydjgs/
小舟從此逝,江海寄余生。 --狐貍