這可能是最透徹的氣泡排序演算法解析(java實現)
阿新 • • 發佈:2018-12-14
氣泡排序是一種思想簡單,便於理解和實現的排序演算法,也許是很多人學習的第一個排序演算法,廢話不多說,我們來實現它
演算法詳解
我們以升序排列為例,演算法的思想是,遍歷整個陣列,依次對陣列中的每兩個數進行比較大小,通過兩個數字的交換,達到將最大的元素移動到陣列的最後的目的,然後再次進行遍歷,將第二大的數字移動到陣列的倒數第二個位置…這樣一次次遍歷下來,陣列將變為有序。舉例如下,假設有一串數,以降序排列,現在我們要將它變為升序,這對於氣泡排序是最壞的一種情況 陣列的變化如下:
原陣列:
6,5,4,3,2,1
第一次遍歷:
5,6,4,3,2,1 5,4,6,3,2,1 5,4,3,6,2,1 5,4,3,2,6,1 5,4,3,2,1,6
第二次遍歷:
4,5,3,2,1,6
4,3,5,2,1,6
4,3,2,5,1,6
4,3,2,1,5,6
4,3,2,1,5,6(多餘)
第三次遍歷
3,4,2,1,5,6
3,2,4,1,5,6
3,2,1,4,5,6
3,2,1,4,5,6(多餘)
3,2,1,4,5,6(多餘)
第四次遍歷
2,3,1,4,5,6
2,1,3,4,5,6
2,1,3,4,5,6(多餘)
2,1,3,4,5,6(多餘)
2,1,3,4,5,6(多餘)
第五次遍歷(多餘)
1,2,3,4,5,6 1,2,3,4,5,6(多餘) 1,2,3,4,5,6(多餘) 1,2,3,4,5,6(多餘) 1,2,3,4,5,6(多餘)
規律
1.對於內部交換操作,我們可以看到,每進行一次遍歷,就會有一個新的數的比較操作是多餘的,也就是說,我們只需要交換
2.最後一次遍歷是多餘的
3.對於內部交換,只用比較 陣列長度-1 次,以第一次遍歷為例,陣列長度是6,但實際上我們的內部交換操作只比較了5次就足夠了
java程式碼實現:
public static void main(String[] args) {
int[] a= {6,5,4,3,2,1};
for(int i=0;i<a.length-1;i++)
{
for(int j=0;j<a.length-i-1;j++)
{
if (a[j]>a[j+1])//交換操作
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int s:a)//遍歷陣列中的元素並輸出
{
System.out.println(s);
}
}
總結
事實上,很多演算法都是通過找規律得出來的,當我們研究演算法遇到瓶頸時,不妨把演算法每一步的變化在紙上畫出來,然後像上小學時找規律一樣找到其中的規律,然後就容易得多了。