互聯網行業從業者在面試的過程中經常會碰到這樣一個問題,尤以測試人員和開發人員碰到的幾率最高:請說一說你熟悉的幾種排序算法。
這個問題或許不是作為唯一考核你專業技能的一個問題,但是如果你能答得上來,面試官肯定會給你打一個比較高的印象分,因為算法直接考察了一個人的思維和邏輯,分析數據,解決問題的能力。這也是當下很多高新企業越來越注重和強調的人才素質。
可惜的是很多人在這道題上的表現都很差強人意,要么就是完全答不上來,要么就是聽過,但是解釋起來卻很混亂,這都是源于平時很少了解算法或者對于算法一知半解導致的。
好吧,在介紹冒泡算法之前,肯定還有很多小白連算法的概念都不知道,所以還是先來做一下掃盲吧。算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述解決問題的策略機制。這個是百度百科的解釋,其實說的更簡單點,算法就是計算的方法。
回到上面的問題,請列舉你熟悉的幾種排序算法。
這里小編就給大家介紹常見的幾種排序算法:冒泡排序,快速排序,插入排序,選擇排序,希爾排序等等,通常,說出兩三個你比較熟悉的排序就基本上能搞定面試官了。
咱們這里不會針對每種排序算法去做分析和講解,咱們來重點談談經典排序算法------冒泡排序,說一說它到底是怎么去排的。
首先來了解冒泡這個概念,咱們應該都見過水中的氣泡,越往上冒,氣泡就越大,所以就用這個生活中常見的現象來描述冒泡排序,把大的數字往上面一直冒,直到所有的數據都是按照從小到大的順序來排列就是冒泡排序的思想。
假設咱們有幾個雜亂無序的數字:4,3,6,2,1,5,那么要通過冒泡排序來將這幾個數字按照從小到大的順序來排序,要怎么做呢?
思路:拿第一個數字跟其他所有數字進行比較,若比它大則交換位置,直到將這些數字中最大的數字冒到最上面,接著再繼續第2輪,第3輪,第4輪,第5輪,直到所有大的數組都冒到了上面,這樣所有的數據就會按照從小到大來進行排序。
上面是小編畫的原理圖,如果你還是看不懂,那我們就只能上咱們的終極武器了,下面是小編在網上找到的冒泡懵逼排序圖,希望能夠幫助你們去理解這個算法的原理
上面是排序的算法,如果要用代碼來實現,該如何寫呢?下面小編就用java代碼來實現上面這個冒泡排序:
那我們再來分析一下這個算法的復雜度。
我們來看一下整個冒泡過程中數值之間總共比較了多少次。
假設要參與排序的數有n個,則第一輪冒泡第一個數要跟其他n-1個數都進行比較,所以要進行n-1次比較,最大的數被冒到了最上面。
所以第二輪冒泡就相當于前面n-1個數進行冒泡,所以第二輪要進行n-2次比較,以此類推,第三輪比較次數為n-3,最后兩個數冒泡的時候只要比較1次。
所以比較次數其實是一個從1到n-1的等差數列的和,所以總共比較次數按照等差數列求和就是:[1+(n-1)]*(n-1)/2,所以最后得到的次數就是n*(n-1)/2次。
這里小編就冒泡排序做了一下簡單的介紹,包括冒泡的原理,以及代碼實現。至于其他排序算法,感興趣的同學可以自行百度去了解。