日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典冒泡排序及其优化

發布時間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典冒泡排序及其优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣一趟過去后,最大或最小的數字被交換到了最后一位,然后再從頭開始進行兩兩比較交換,直到倒數第二位時結束,其余類似,看例子。

例子為從小到大排序,為了便于觀察,選取

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

第一趟排序(外循環)

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

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

交換后狀態| 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


下面是代碼實現(僅供參考),為了更直觀地表示優化結果,選取

原始待排序數組:|2|1|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|

public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;for (int i = 0; i < n && flag; i++) {flag = false;for (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序運行時間:" + (end - start) + "毫秒");} }
輸出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序運行時間:1.0毫秒

顯然,這樣的程序是有問題的。因為除了第一和第二個關鍵字需要交換外,別的都已經是正常順序,,當 i=1 時,交換了2和1,此時序列已經有序,但是算法仍然不依不饒地將 i=2 到 i=29 比較一遍。盡管并沒有交換數據,但是之后的大量比較還是大大多余了。


public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;// flag作為標記for (int i = 0; i < n && flag; i++) {// 當flag為true時退出循環flag = false;// 初始flag為falsefor (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;// 如果有數據交換,則flag為true}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序運行時間:" + (end - start) + "毫秒");} }

輸出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序運行時間:0.0毫秒


由此可見,稍微加個flag,程序運行時間縮短了。

總結

以上是生活随笔為你收集整理的经典冒泡排序及其优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。