Java排序之冒泡排序
?jwt簡介
冒泡排序:(Bubble Sort)是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當(dāng)成一個小氣泡,根據(jù)氣泡大小,一步一步移動到隊伍的一端,最后形成一定對的順序。
冒泡排序的原理:
我們以一個隊伍站隊為例,教官第一次給隊員排隊是無序的,這時候就需要排隊,按矮到高的順序排列,首先拎出第一第二個比較,如果第一個隊員比第二個要高,則兩個交換位置, 高的放到排到第二個位置,矮的就排到第一個,再把第二個,第三個比較,把高的排到后面一個位置,然后以此類推,直至第一輪所有隊員都比較過一次(記住每次比較都是相鄰的兩個),這樣就可以把最高的排到最后的位置。
總結(jié)就是: 每一輪都需要從第一位開始進行相鄰的兩個數(shù)的比較,將較大的數(shù)放后面,比較完畢之后向后挪一位繼續(xù)比較下面兩個相鄰的兩個數(shù)大小關(guān)系,重復(fù)此步驟,直到最后一個還沒歸位的數(shù)。
冒泡排序流程圖:
我們進行分解看看每一步是怎么執(zhí)行的
首先我們給個無序數(shù)組 [3,14,32,16,53,8] 進行升序排序
- 第一輪:初始值[3,14,32,16,53,8]
如圖所示,走完第一輪之后,我們得到的結(jié)果就是[3,14,16,32,8,53],此時已經(jīng)將最大的數(shù)53排到了指定位置,所以冒泡排序每一輪只能確定將一個數(shù)歸位。即第一趟只能確定將末位上的數(shù)歸位, 第二趟只能將倒數(shù)第 2 位上的數(shù)歸位,依次類推下去
- 第二輪:初始值[3,14,16,32,8,53]
第二輪排序結(jié)果[3,14,16,8,32,53]
- 第三輪:初始值[3,14,16,8,32,53]
第三輪排序結(jié)果[3,14,8,16,32,53]
- 第四輪:初始值[3,14,8,16,32,53]
第四輪排序結(jié)果[3,8,14,16,32,53]
- 第五輪:初始值[3,8,14,16,32,53]
第五輪排序結(jié)果[3,8,14,16,32,53] 到這,我們最終排序完成。
Java代碼實現(xiàn):
輸出結(jié)果
我在每輪比較的時候定義了一個num來記錄比較次數(shù),大家可以看到長度為6的數(shù)組比較,比較了5輪,每輪都比較了5次, 但是通過上面拆分的每一輪比較細節(jié)可以看出,其實約到后面的比較,有一部分已經(jīng)是排好了,如果某個數(shù)比他的下一個位置還小, 就沒有必要和后面已經(jīng)排好的數(shù)據(jù)再做比較,這樣只會增加程序運行壓力。
比如,第四輪,8和14比較,換位之后,16,32,53都已經(jīng)排好了,14再和16比較,不用換位,那16之后的數(shù)據(jù)已經(jīng)在第三輪排好,就沒必要再比較16和32,32和53了。
那我們來對程序做一個優(yōu)化,其實在第一輪把最大的數(shù)字排到最后之后,第二輪就不用再和最后一個數(shù)字比較,因為最大的數(shù)字已經(jīng)排好,再比較也只能排在最后一位之前了。
優(yōu)化:
優(yōu)化代碼如下:
我們再來看看結(jié)果:
由此,我們可以看到,由之前30次比較減少到15次,所以程序壓力會少很多,程序復(fù)雜度也降低了。由上面結(jié)果可知:6位長度的數(shù)組需要排五輪,每輪次數(shù)減1,那如果由n個長度的數(shù)組,需要比較多少次呢?
- 第一輪:6-1
- 第二輪:6-2
- 第三輪:6-3
- 倒數(shù)第二輪:2
- 倒數(shù)第一輪:1
得出結(jié)果:(n-1)+(n-2)+...+2+1 = n(n-1)/2 =1/2n^2 -1/2n是一個等差數(shù)列,按照時間復(fù)雜度規(guī)則,直接取最高階項并去除常熟系數(shù)等到時間復(fù)雜度就是 O(n^2)了
到這,我們的冒泡排序就了解完了。