冒泡排序是八大排序算法之一。其排序原理是每次都對(duì)相鄰的兩個(gè)數(shù)進(jìn)行比較,如果前面一個(gè)數(shù)大于后面一個(gè)數(shù)警绩,那就交換兩個(gè)數(shù)的位置,這樣一直循環(huán)下來就可以把最大的找到放在最后面后室。
如現(xiàn)在有一組數(shù)據(jù):[3, 1, 8, 6, 2, 5, 9, 4, 7]
使用冒泡排序?qū)@組數(shù)據(jù)進(jìn)行排序岸霹,具體流程:
第一趟排序: 從前往后一次把相鄰的兩個(gè)數(shù)進(jìn)行比較贡避。
3 1 8 6 2 5 9 4 7
(1) 把3和1進(jìn)行比較刮吧,3>1,把3和1交換位置
1 3 8 6 2 5 9 4 7
(2) 把3和8進(jìn)行比較琉历,3<8,則不做任何事
1 3 8 6 2 5 9 4 7
(3)把8和6進(jìn)行比較旗笔,8>6蝇恶,把8和6交換位置
1 3 6 8 2 5 9 4 7
(4)把8和2進(jìn)行比較撮弧,8>2,把8和2交換位置
1 3 6 2 8 5 9 4 7
(5)把8和5進(jìn)行比較,8>5贸辈,把8和5交換位置
1 3 6 2 5 8 9 4 7
(6)把8和9進(jìn)行比較,8<9,則不做任何事
1 3 6 2 5 8 9 4 7
(7)把9和4進(jìn)行比較,9>4桩盲,把9和4交換位置
1 3 6 2 5 8 4 9 7
(8)把9和7進(jìn)行比較,9>7弊攘,把9和7交換位置
1 3 6 2 5 8 4 7 9
第一趟排序下來襟交,我們發(fā)現(xiàn)已經(jīng)把最大值找到放在了最右邊捣域,那接下來我們只需要對(duì)前面8個(gè)數(shù)進(jìn)行排序就可以了
第二趟排序
1 3 6 2 5 8 4 7 9
(1) 把1和3進(jìn)行比較焕梅,1<3卦洽,則不做任何事
1 3 6 2 5 8 4 7 9
(2) 把3和6進(jìn)行比較,3<6,則不做任何事
1 3 6 2 5 8 4 7 9
(3) 把6和2進(jìn)行比較蚤霞,6>2,把6和2交換位置
1 3 2 6 5 8 4 7 9
(4) 把6和5進(jìn)行比較规肴,6>5拖刃,把6和5交換位置
1 3 2 5 6 8 4 7 9
(5) 把6和8進(jìn)行比較兑牡,6<8兔簇,則不做任何事
1 3 2 5 6 8 4 7 9
(6) 把8和4進(jìn)行比較硬耍,8>4经柴,把8和4交換位置
1 3 2 5 6 4 8 7 9
(7) 把8和7進(jìn)行比較墩朦,8>7氓涣,把8和7交換位置
1 3 2 5 6 4 7 8 9
經(jīng)過第二趟排序,我們是不是又把一個(gè)最大值找到了引润,就是8痒玩,而且我們發(fā)現(xiàn)我們的數(shù)據(jù)越來越接近要排序之后的效果了。
而且有的時(shí)候相鄰的兩個(gè)數(shù)是不是之前就已經(jīng)排好序了?就像第(5)步草讶,是不是不用做任何事情。這就是冒泡排序可以在原來的基礎(chǔ)上進(jìn)行優(yōu)化的地方坤溃。
而且我們的每趟排序要排序的次數(shù)都會(huì)比要排序數(shù)組的長(zhǎng)度少1個(gè)浇雹。就像第一趟有9個(gè)數(shù)要排屿讽,我們只排序了8次吠裆;第二趟有8個(gè)數(shù)要排,我們只排序了7次诵棵。那么經(jīng)過這樣不停的循環(huán)祝旷,我們是不是就可以得到最終結(jié)果了嘶窄。
現(xiàn)在直接上代碼
public static void bubbleSort(int[] array){
for(int i = array.length-1; i>0; i--){
boolean flag = true; //如果是true,就證明比較的兩個(gè)數(shù)據(jù)是有序的
for(int j = 0; j<i; j++){
if(array[j]> array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = false;
}
}
if(flag){ //如果之前沒有發(fā)生過交換,那flag就還是true忠蝗,我們?cè)谶@里退出可以減少排序次數(shù)
break;
}
}
}
冒泡排序應(yīng)用場(chǎng)景:
(1)數(shù)據(jù)量較小,在8個(gè)數(shù)以內(nèi)戒祠,數(shù)據(jù)量大的話冒泡排序的性能比較差速种。
(2)斗牛游戲、炸金花的紙牌排序(多關(guān)鍵字排序,需自己定義排序規(guī)則闸餐,使用對(duì)象的compareTo接口)。
小編總結(jié)舍沙,請(qǐng)指出不足拂铡!