冒泡排序(Bubble Sort)也是一種簡(jiǎn)單直觀的排序算法纺且。
它重復(fù)地走訪過(guò)要排序的元素列扬绪,依次比較兩個(gè)相鄰的元素,
如果順序(如從大到小草讶、首字母從Z到A)錯(cuò)誤就把他們交換過(guò)來(lái)。
走訪元素的工作是重復(fù)地進(jìn)行直到?jīng)]有相鄰元素需要交換扁瓢,也就是說(shuō)該元素列已經(jīng)排序完成详恼。
動(dòng)圖演示排序過(guò)程
bubbleSort.gif
總結(jié):
1.進(jìn)行數(shù)組的大小 - 1次循環(huán)
2.每一次循環(huán)排序的次數(shù)逐漸減少
3.如果發(fā)現(xiàn)某次循環(huán)排序沒(méi)有發(fā)現(xiàn)一次交換,則可以提前結(jié)束排序(優(yōu)化)
代碼實(shí)現(xiàn)(java)
/**
* 已經(jīng)優(yōu)化的冒泡排序(從小到大排序)
*
* @param array 需要排序的數(shù)組
*/
public static void sort(int[] array) {
// 臨時(shí)變量,用于輔助交換
int temp;
// 交換標(biāo)識(shí)引几,默認(rèn)沒(méi)有發(fā)生交換
boolean flag = false;
// 兩兩比較昧互,因此最后一個(gè)是倒數(shù)第二個(gè)(length - 1)
for (int i = 0; i < array.length - 1; i++) {
// length - 1 - i:比較次數(shù)逐漸減少,每循環(huán)一次 - 1,即 - i
// 后面的即為最大的因此不需要再排序
for (int j = 0; j < array.length - 1 - i; j++) {
// 比較大小伟桅,大于則進(jìn)行交換
if (array[j] > array[j + 1]) {
temp = array[j];
// 發(fā)生交換
flag = true;
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
// 如果沒(méi)有發(fā)生交換敞掘,說(shuō)明已經(jīng)排好了,則結(jié)束循環(huán)
if (!flag) {
break;
}
}
}
什么時(shí)候最快
當(dāng)輸入的數(shù)據(jù)已經(jīng)是正序時(shí)楣铁。
什么時(shí)候最慢
當(dāng)輸入的數(shù)據(jù)是反序時(shí)玖雁。