轉載請註明出處:http://blog.csdn.net/ljmingcom304/article/details/50341295
本文出自:【樑敬明的博客】
1.冒泡排序
冒泡排序就是重複的按照特定的順序比較兩兩元素的大小,交換它們,直到最後沒有可以交換的元素爲止。
如上圖所示,假設一個序列的初始狀態爲【9】【8】【7】【6】【5】,將序列由小到大進行排序,每次進行排序時從後往前依次比較兩個數的大小,將較小的數前置。
第一次排序,找到最小的數爲5,將其排在序列的第1位。
第二次排序,找到最小的數爲6,將其排在序列的第2位。
第三次排序,找到最小的數爲7,將其排在序列的第3位。
第四次排序,找到最小的數爲8,將其排在序列的第4位。
只剩最後一個數,不用再次進行比較,直接位於序列最後。
2.示例代碼
假設對一個長度爲N的序列由小到大進行排序,第i次排序,需要找到最小的數爲m,將其排在序列的第i位,當最終完成排序後需要進行N-1次排序。
當進行第i次排序時,需要從N與N-1開始從後往前兩兩元素進行比較,直到比較到第i位爲止。
當元素間進行兩兩比較時,位置不在發生變換,說明此時序列爲有序序列,可以直接結束循環。
public class BubbleSort {
public static void main(String[] args) {
int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
BubbleSort.sort(array);
System.out.println("排序後數組:" + Arrays.toString(array));
}
public static void sort(int[] a) {
// 用於標誌排序過程中元素是否發生交換
boolean flag = false;
for (int i = 0; i < a.length - 1; i++) {
// 從後向前遍歷依次比較相鄰兩數大小,將較小的數進行前置
for (int j = a.length - 1; j > i; j--) {
if (a[j - 1] > a[j]) {
a[j] = a[j - 1] + a[j];
a[j - 1] = a[j] - a[j - 1];
a[j] = a[j] - a[j - 1];
flag = true;
}
}
// 若某一輪沒有發生交換,說明是有序數列,直接跳出循環
if (flag == false)
break;
System.out.println(Arrays.toString(a));
}
}
}
3.算法分析
時間複雜度:
若序列的初始狀態處於正序,遍歷一次,不需要交換元素間的位置,即可完成排序,所以比較次數和移動次數均爲最小值。比較次數
若序列的初始狀態爲倒序,需要進行n-1次排序,每次排序都需要進行n-i次的比較,都需要移動記錄三次來交換元素位置,所以比較次數和移動次數均爲最大值。比較次數
因此,冒泡排序總的時間複雜度爲
算法穩定性:
冒牌排序是比較相鄰的兩個元素,交換也發生在兩個元素之間,若兩個元素相等,不會發生交換,相同元素的順序不會發生改變。因此,冒泡排序是一種穩定的排序算法。