排序的总结(一级)
下面我們來看各種排序的一個總結(jié):大家記住這么幾個結(jié)論,前面我們已經(jīng)做了各個排序的一個講解,那這個時候我們再來看這個圖印象會深刻一點(diǎn),我們來看了,1. 直接插入排序,簡單選擇排序,冒泡排序,是最簡單的三種排序算法,是最基本的排序,再次強(qiáng)調(diào)了,他們的時間復(fù)雜度是O(n 2),注意這已經(jīng)是最高的了,這效率已經(jīng)夠低的了,不可能還有一種算法比這個還高,如果還有的話就堅決放棄,兩輪的就搞定了,不用再三輪了,這個大家知道,作為基礎(chǔ)排序,所以一定要掌握,直接插入排序,選擇排序,冒泡排序,復(fù)雜度都是n的平方,效率比較低的2. 這三種基本的算法比較簡單,效率很低,所以每種算法至少還對應(yīng)著一個相應(yīng)的高級算法,在簡單排序的基礎(chǔ)上進(jìn)行優(yōu)化,算法復(fù)雜了,但是性能高了,可能還會導(dǎo)致一個更高的空間復(fù)雜度,比如shell排序,n的1.3,他是怎么算出來的,大家可以看一下相關(guān)的文檔,n的1.3次方,堆排序呢,n*log2 n,快速排序呢,n*log2n,n的平方就是n*n,哪個效率高,n*log2 n效率高m,這個快速排序可能需要更多地輔助空間,為什么需要這個空間,一般來說需要用到遞歸了,這是一個內(nèi)容3.快速排序和歸并排序,都使用了分治和遞歸,一個叫快速排序,一個叫歸并排序,他們都使用到了分治和遞歸,被問到的機(jī)會比較高,尤其是快排,名字叫快排,確實(shí)也比較快,他快到什么程度呢4. 從時間性能上看,快速排序是所有排序算法中性能最好的,除了下面非比較的,他可以認(rèn)為是效率最高的,但是他有好壞之分,有平均情況,也有最壞的情況,什么是最壞的情況,如果數(shù)據(jù)基本上有序了,你使用快排再排,他需要花更多的額時間,但是我們的快排都有優(yōu)化的空間,他的時間性能還不如堆排序和歸并排序,所以大家記住,他適合數(shù)據(jù)不大的情況,我們平時寫個數(shù)據(jù)不會太大吧,我們處理的數(shù)據(jù)一般不會太大,所以優(yōu)先掌握快速的5. 那這個堆排序,看這個堆排序,快速排序是n*log2 n,堆排序也是n*log2 n,最好的也是堆排序,這個和快排是一樣的,但是快排最壞的情況可以和冒泡達(dá)到一樣,這個效率太低了,堆排序還是這個樣子,這個堆是比較穩(wěn)定的,但是這個堆是什么意思,什么叫堆,在JAVA里面堆就是符合條件的二叉樹,堆實(shí)際上就是二叉樹,發(fā)現(xiàn)了沒,這個排序?qū)嶋H上是用了樹了,所以相對而言是比較復(fù)雜,快速排序是和樹沒關(guān)系,就是一個線性表就可以了,這是一個,堆就是一個樹,堆排序在任何情況下都很平均,是他的一個優(yōu)點(diǎn),但是堆排序得先構(gòu)建一個堆,建一棵樹,數(shù)比較小的時候就不要用它了,體量大,就可以用它6. 還有歸并排序,我們再往下看,看這一塊,快速排序和堆排序相比,歸并排序的有點(diǎn)是比較穩(wěn)定,最壞的情況也比較好如果還有時間把這個也看一下,它里面也用到了遞歸,也用到了分治,這是一個
8. 然后我們再來討論穩(wěn)定性,我們怎么來看這個穩(wěn)定性呢,仔細(xì)來看了,哪些是穩(wěn)定的,哪些是不穩(wěn)定的,找規(guī)律,找什么規(guī)律呢,就插入排序,交換排序,選擇排序,每個里面我們提供兩個,我們可以得出一個什么結(jié)論呢,每個里面有一個基本的,還有一個完善的,兩個排序,那大家記住,基本的排序,穩(wěn)定的,三種基本排序一般都是基本穩(wěn)定的,當(dāng)然有一個例外,你特別把它記住就可以了,那還有一個他們對應(yīng)的高級的排序怎么辦,全部是不穩(wěn)定的,我們可以這么來記,這是我們選擇的一個依據(jù),然后再告訴大家一點(diǎn),這一點(diǎn)也非常重要,哪一點(diǎn)特別重要呢,基于比較的時間復(fù)雜度下限是Ω(N*log2 n),Ω什么意思,他是最好的還是最壞的,n*log2 n這個已經(jīng)是最好的性能了,堆排序,歸并排序,不可能比這個性能更好,已經(jīng)用數(shù)學(xué)證明過了,最壞的是O(n2),所以這個理論大家要記住了,基于比較的排序最高的性能,最好的性能不可能比他再高,也就是他了,已經(jīng)是最壞的了這是一個,如果別人問你,你能不能給我寫一個時間復(fù)雜度是O(n)復(fù)雜度的,O(n)級別也是線性級別的,能不能寫出來,能,最好的效率是n*logn,是基于比較的排序,我們看剛才的排序,是不是還有非比較的,計數(shù)排序和基數(shù)排序,這個性能比較高,但還用的并不多,其實(shí)是很少問的,你把這個基數(shù)排序給我寫一下嗎,好像還沒有人問過這種,估計別人也不會,我們掌握的話內(nèi)容很多,雖然好但是用的并不多9. 如果別人要求你寫了一個O(n)時間復(fù)雜度的排序算法,你千萬不要說不可能,可能的,使用非比較的排序,比如計數(shù)排序,基數(shù)排序,可以達(dá)到O(n)的復(fù)雜度,它是可以達(dá)到這個復(fù)雜度的,他們是有前提條件的,得滿足一定的條件,并且需要更多的輔助空間,有利有弊,這是一個10. 最后一點(diǎn),請問這幾種排序哪一種最好,很難說哪一種最好,沒有最好的,只有最合適的,如果說最好的那冒泡永遠(yuǎn)都不是最好的,那就別用它了,但是如果數(shù)據(jù)量少的話也沒什么影響,所以這個大家記住,沒有最好的,只有更合適的,我們根據(jù)情況可以選擇這些,這是我們排序的最后的一個總結(jié),再次強(qiáng)調(diào)一下,3種基本排序,直接插入,直接選擇,冒泡,一定要掌握,快速排序作為一個必殺技,一定要掌握,能夠把這個問題回答出來,而且回答的特別好,就會大大加分,歸并排序有時間也可以看一下
?
總結(jié)
- 上一篇: 快速排序(三级)
- 下一篇: 索引创建以及优化_1