經典排序算法 - 冒泡排序Bubble sort

經典排序算法 冒泡排序Bubble sort算法

 

原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,windows

 

這樣一趟過去後,最大或最小的數字被交換到了最後一位,數組

 

而後再從頭開始進行兩兩比較交換,直到倒數第二位時結束,其他相似看例子ide

 

例子爲從小到大排序,優化

 

原始待排序數組| 6 | 2 | 4 | 1 | 5 | 9 |spa

 

 

 

第一趟排序(外循環).net

 

第一次兩兩比較6 > 2交換(內循環)orm

 

交換前狀態| 6 | 2 | 4 | 1 | 5 | 9 |blog

 

交換後狀態| 2 | 6 | 4 | 1 | 5 | 9 |排序

 

 

 

第二次兩兩比較,6 > 4交換

 

交換前狀態| 2 | 6 | 4 | 1 | 5 | 9 |

 

交換後狀態| 2 | 4 | 6 | 1 | 5 | 9 |

 

 

 

第三次兩兩比較,6 > 1交換

 

交換前狀態| 2 | 4 | 6 | 1 | 5 | 9 |

 

交換後狀態| 2 | 4 | 1 | 6 | 5 | 9 |

 

 

 

第四次兩兩比較,6 > 5交換

 

交換前狀態| 2 | 4 | 1 | 6 | 5 | 9 |

 

交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

 

 

 

第五次兩兩比較,6 < 9不交換

 

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |

 

交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

 

 

 

第二趟排序(外循環)

 

第一次兩兩比較2 < 4不交換

 

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |

 

交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |

 

 

 

第二次兩兩比較,4 > 1交換

 

交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 | 

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

 

 

 

第三次兩兩比較,4 < 5不交換

 

交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 | 

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

 

 

 

第四次兩兩比較,5 < 6不交換

 

交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |

 

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

 

 

 

第三趟排序(外循環)

 

第一次兩兩比較2 > 1交換

 

交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |

 

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

 

 

 

第二次兩兩比較,2 < 4不交換

 

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 | 

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

 

 

 

第三次兩兩比較,4 < 5不交換

 

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 | 

交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |

 

 

 

第四趟排序(外循環)無交換

 

第五趟排序(外循環)無交換

 

 

 

排序完畢,輸出最終結果1 2 4 5 6 9

 

咱們把後邊想像成水面,前邊是水底,就是冒泡泡了

代碼以下:

// 冒泡排序1

void BubbleSort1(int a[], int n) {

int i, j;

for (i = 0; i < n; i++)

for (j = 1; j < n - i; j++)

if (a[j - 1] > a[j])

Swap(a, j);

}

下面對其進行優化,設置一個標誌,若是這一趟發生了交換,則爲true,不然爲false。明顯若是有一趟沒有發生交換,說明排序已經完成。

void BubbleSort2(int a[], int n) {

int j, k;

boolean flag;

k = n;

flag = true;

while (flag) {

 

flag = false;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = true;

}

k--;

}

}

 

再作進一步的優化。若是有100個數的數組,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置一定小於10,且這個位置以後的數據一定已經有序了,記錄下這位置,第二次只要從數組頭部遍歷到這個位置就能夠了。

// 冒泡排序3

void BubbleSort3(int a[], int n) {

int j, k;

int flag;

 

flag = n;

while (flag > 0) {

k = flag;

flag = 0;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = j;

}

}

}

完整代碼以下:

publicclass SortTest {

 

publicstaticvoid main(String[] args) {

int[] a = { 6, 2, 4, 1, 5, 9 };

new SortTest().BubbleSort3(a, a.length);

}

// 冒泡排序3

void BubbleSort3(int a[], int n) {

int j, k;

int flag;

 

flag = n;

while (flag > 0) {

k = flag;

flag = 0;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = j;

}

}

}

// 冒泡排序2

void BubbleSort2(int a[], int n) {

int j, k;

boolean flag;

k = n;

flag = true;

while (flag) {

 

flag = false;

for (j = 1; j < k; j++)

if (a[j - 1] > a[j]) {

Swap(a, j);

flag = true;

}

k--;

}

}

 

// 冒泡排序1

void BubbleSort1(int a[], int n) {

int i, j;

for (i = 0; i < n; i++)

for (j = 1; j < n - i; j++)

if (a[j - 1] > a[j])

Swap(a, j);

}

 

privatevoid Swap(int[] a, int j) {

int temp = a[j - 1];

a[j - 1] = a[j];

a[j] = temp;

 

for (int j2 = 0; j2 < a.length; j2++) {

System.out.print(a[j2] + "  ");

}

System.out.println();

 

}

}

 

轉自:http://blog.csdn.net/morewindows/article/details/6657829

相關文章
相關標籤/搜索