什么是冒泡排序?
百度百科:冒泡排序(Bubble Sort),是一種計(jì)算機(jī)科學(xué)領(lǐng)域的較簡(jiǎn)單的排序算法梭姓。它重復(fù)地走訪過要排序的元素列,依次比較兩個(gè)相鄰的元素沦泌,如果他們的順序(如從大到小糊昙、首字母從A到Z)錯(cuò)誤就把他們交換過來(lái)辛掠。走訪元素的工作是重復(fù)地進(jìn)行直到?jīng)]有相鄰元素需要交換谢谦,也就是說(shuō)該元素已經(jīng)排序完成。這個(gè)算法的名字由來(lái)是因?yàn)樵酱蟮脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列)萝衩,就如同碳酸飲料中二氧化碳的氣泡最終會(huì)上浮到頂端一樣回挽,故名“冒泡排序”。
算法原理猩谊?
數(shù)組:arr = {1千劈, 2, 3牌捷, 4墙牌, 5, 6}暗甥;倒序排序
一輪:下標(biāo)0小于下標(biāo)1喜滨,置換兩個(gè)值得位置后得{2, 1撤防, 3虽风, 4, 5, 6}
二輪:下標(biāo)1小于下標(biāo)2辜膝,置換兩個(gè)值得位置后得{2无牵, 3, 1厂抖, 4茎毁, 5, 6}
三輪:下標(biāo)2小于下標(biāo)3验游,置換兩個(gè)值得位置后得{2充岛, 3, 4耕蝉, 1崔梗, 5, 6}
四輪:下標(biāo)3小于下標(biāo)4垒在,置換兩個(gè)值得位置后得{2蒜魄, 3, 4场躯, 5谈为, 1, 6}
五輪:下標(biāo)4小于下標(biāo)5踢关,置換兩個(gè)值得位置后得{2伞鲫, 3, 4签舞, 5秕脓, 6, 1}
一組循環(huán)完成后得{2儒搭, 3吠架, 4, 5搂鲫, 6傍药, 1},不難發(fā)現(xiàn)最后一個(gè)位置已經(jīng)是我們想要的結(jié)果了
再一輪:下標(biāo)0小于下標(biāo)1魂仍,置換兩個(gè)值得位置得{3拐辽, 2, 4擦酌, 5俱诸, 6, 1}
再二輪:下標(biāo)1小于下標(biāo)2仑氛,置換兩個(gè)值得位置得{3乙埃, 4闸英, 2, 5介袜, 6甫何, 1}
再三輪:下標(biāo)2小于下標(biāo)3,置換兩個(gè)值得位置得{3遇伞, 4辙喂, 5, 2鸠珠, 6巍耗, 1}
再四輪:下標(biāo)3小于下標(biāo)4,置換兩個(gè)值得位置得{3渐排, 4炬太, 5, 6驯耻, 2亲族, 1}
再一組完成,不難發(fā)現(xiàn)這一組的輪數(shù)會(huì)比上一組輪數(shù)少一輪可缚,因?yàn)樯弦唤M已經(jīng)選出了一個(gè)最值
霎迫。。帘靡。
若arr.length = n知给,比較輪數(shù)應(yīng)該是
第一組:比較n - 1輪
第二組:比較n - 2輪
第三組:比較n - 3輪
。描姚。涩赢。
第n-1組:比較1輪
算法實(shí)現(xiàn)?
// 冒泡排序 - 倒序排序
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length == 0) {
throw new RuntimeException("arr_is_empty");
}
// 控制循環(huán) 組數(shù) 共n-1組
for (int i = 1; i < arr.length; i++) {
// 控制組內(nèi)循環(huán) 輪數(shù) 一組比一組少
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] < arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
一句話說(shuō)清冒泡排序轰胁?
冒泡排序就是"瘸子里面選將軍(最值)"摄杂。
一個(gè)數(shù)組里面的數(shù)都是"瘸子"藏古,但是要在里面選一個(gè)"將軍"拳魁,假如數(shù)組長(zhǎng)度為6篱昔,這樣就變成了6個(gè)瘸子里面選一個(gè)將軍钉鸯,5個(gè)瘸子里面選一個(gè)將軍帅矗,4個(gè)瘸子里面選一個(gè)將軍绊汹,3個(gè)瘸子里面選一個(gè)將軍永票,2個(gè)瘸子里面選一個(gè)將軍搂捧,最后一個(gè)瘸子內(nèi)定為將軍驮俗。