冒泡排序算法的名字由來是由於越大的元素會經由交換慢慢「浮」到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端同樣,故名「冒泡排序」。冒泡排序是八大排序中的入門級排序算法,也是算法入門中比較經典的排序算法。本篇系統介紹下冒泡排序的原理以及實現。java
循環對比數組中先後相鄰的兩個元素,將較大的數交換移動到後面,一趟排序以後最大的數會被移動到最末尾。而後排除最末尾最大數,繼續循環將最大數移動到末尾,最終保證數組有序。算法
以數組int n[] = { 6, 5, 2, 7, 1 }爲例: 數組
一趟排序後數組中最大的數字7位於數組末位bash
一趟排序後最大數字位與末位,經過控制數組下標大小,每次循環將須要排序數組個數減少一個,從而使得一趟排序後剔除當前最大元素後,繼續對比交換依次將最大數字移動至末位: 優化
public class Test {
public static void main(String[] args) {
int n1[] = { 6, 5, 2, 7, 1 };
bubbleSort1(n1);
System.out.print("冒泡排序方法一結果:");
for (int m : n1) {
System.out.print(m + " ");
}
System.out.println("");
int n2[] = { 6, 5, 2, 7, 1 };
bubbleSort1(n2);
System.out.print("冒泡排序方法二結果:");
for (int m : n2) {
System.out.print(m + " ");
}
System.out.println("");
int n3[] = { 6, 5, 2, 7, 1 };
bubbleSort1(n3);
System.out.print("冒泡排序方法三結果:");
for (int m : n3) {
System.out.print(m + " ");
}
}
public static void bubbleSort1(int n[]) {
for (int i = n.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
if (n[j] > n[j + 1]) {
int temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
}
}
}
}
public static void bubbleSort2(int n[]) {
for (int i = n.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
if (n[j] > n[j + 1]) {
n[j] ^= n[j + 1];
n[j + 1] ^= n[j];
n[j] ^= n[j + 1];
}
}
}
}
public static void bubbleSort3(int n[]) {
boolean isSort = false;
for (int i = n.length - 1; i >= 0 && !isSort; i--) {
isSort = true;
for (int j = 0; j < i; j++) {
if (n[j] > n[j + 1]) {
n[j] ^= n[j + 1];
n[j + 1] ^= n[j];
n[j] ^= n[j + 1];
isSort = false;
}
}
}
}
}
複製代碼
冒泡排序方法一結果:1 2 5 6 7
冒泡排序方法二結果:1 2 5 6 7
冒泡排序方法三結果:1 2 5 6 7
複製代碼
上述三種冒泡排序的編碼實踐方法中,第一種是冒泡排序最基礎的寫法;第二種使用位運算優化交換數字的效率;第三方法,利用標記位斷定數組是否已經有序從而避免對有序數組的遍歷進一步優化效率。編碼
方法二bubbleSort2中交換數字使用的位運算:spa
n[j] ^= n[j + 1];
n[j + 1] ^= n[j];
n[j] ^= n[j + 1];
複製代碼
交換的原理是?這即是本篇的彩蛋。code
冒泡排序是最簡單的排序算法之一,本篇重點介紹冒泡排序算法思想原理以及實現。進一步又介紹了冒泡的優化小技巧,理解本篇後相信往後再碰見手寫冒泡排序的場景會更加駕輕就熟,學無止境。最後,若是以爲本篇對你有所啓發或幫助,不妨關注走一波0.0cdn