排序演算法 歸併 快排

2021-10-05 06:03:19 字數 2264 閱讀 1332

歸併排序的思想是分治法,如果想要將乙個陣列排序,那麼將這個陣列分為左區間和右區間,左區間一定是小於右區間的,再將左區間繼續劃分,右區間也繼續劃分。。。

最後將排好序的陣列全都歸併起來,這樣聽起來像是從上向下劃分,其實歸併排序主要是是從下向上,合併的過程。

先將單個元素的陣列歸併為兩個元素的有序陣列

再將包含兩個元素的有序陣列歸併為四個元素的有序陣列

…最後一步,將兩個n/2元素的陣列,歸併為乙個有序陣列

)}歸併排序的時間複雜度歸併排序的時間複雜度和原陣列的有序度無關,所以它的最好、最壞、平均時間複雜度都是nlogn

假設原陣列歸併排序時間為t(n),那麼分解成兩個陣列後,再合併起來的時間就是:

o(n)=nlogn

歸併排序是穩定的排序演算法:

歸併排序是否穩定,主要是看歸併時的操作,我們只需要在左右區間比較時,如果元素相同,就將左區間的插入陣列就行了

歸併排序不是原地排序演算法:

歸併排序使用了額外的陣列空間,每一次合併操作都會申請一塊空間,當這次操作結束後,這塊空間就會被釋放掉,所以空間複雜度為o(n),所以是不是原地排序演算法

快速排序利用的也是分治思想,他的過程和歸併排序有點像,不過快排是從上向下的排序演算法,就是說先對原陣列進行操作,劃分為兩個區間後,再分別對子區間進行操作

先將原陣列中任意元素作為分割槽點,然後遍歷陣列,將小於分割槽點的放在分割槽點左側,大於分割槽點的,放在分割槽點右側,再這樣依次對左右側區間進行遞迴呼叫

}//最後將分割槽點轉移到相應位置

temp=a[m]

; a[m]

=pivot;

a[low]

=temp;

return m;

//返回分割槽點

}快速排序的時間複雜度快速排序和歸併排序的情況相差不大,在正常情況下,快排的時間複雜度也是nlogn ,但是前提是每次選擇的分割槽點都很合適,但是實際上這種情況很難實現,如果原陣列是有序的,而每次選擇最後乙個元素作為分割槽點,那麼每次分割槽都很不平均,大約需要n次操作才能分割槽完成,而平均每次掃瞄,則需要n/2的時間,所以時間複雜度就退化到o(n2)

但在大多數情況下,快排都可以達到(nlogn)

快速排序是穩定的排序演算法:

在分割槽的過程中涉及交換操作,所以可能導致相同元素之間相對位置改變,所以快排不是穩定的排序演算法

快速排序是原地排序演算法:

和歸併不同的是,快速排序是通過交換來完成資料的轉移,所以空間複雜度是o(1),它是原地排序演算法

雖然歸併排序比快排穩定,並且時間複雜度總是nlogn,而快排有可能在退化為n2,但是快排的空間複雜度證明了它更能節省資源,並且也能通過選擇分割槽點來規避這一弱點,所以通常快排更實用

排序演算法 快排,歸併

從陣列中隨機選乙個數,比這個數大的放右邊,比這個數小的放左邊。快排中的乙個細節 如果乙個數等於p的時候,既可以在左邊又可以在右邊。這麼做是為了避免如果陣列中所有的數都一樣,則會造成資料的不平衡。快排的目的是能夠使得左邊和右邊的數都差不多,這樣的話時間複雜度就不會退化到o n 2 而是o n logn...

演算法整理 排序(歸併和快排)

趁找工作之際,著手對演算法進行相關學習和整理,便於自己複習鞏固,也以此來督促自己進行演算法的研究學習。通過對演算法的整理,一方面希望對於自己有所提高,另一方面,也希望提高自己的書面表達能力,文中有所不正確的地方,望批評指出,多謝。對於演算法學習,從簡單到複雜。今天主要整理一下排序相關的演算法。對於排...

排序演算法 冒泡 插入 歸併 快排

整理了一下幾種常見的排序演算法,包括冒泡 插入 歸併 快排。還有另外幾種待整理 堆排序 希爾排序 桶排序 直接上 include include include using namespace std void swap int a,int b 最簡單的氣泡排序,時間複雜度o n n void bu...